]> err.no Git - linux-2.6/blobdiff - drivers/scsi/advansys.c
[SCSI] advansys: Remove pci_slot_info
[linux-2.6] / drivers / scsi / advansys.c
index 2f3707613285db6b17754236d60cf9b761d275b6..986c52a7b95e86388716e960887663ca70496b8b 100644 (file)
@@ -854,8 +854,6 @@ typedef unsigned char uchar;
 #define ERR      (-1)
 #define UW_ERR   (uint)(0xFFFF)
 #define isodd_word(val)   ((((uint)val) & (uint)0x0001) != 0)
-#define ASC_PCI_ID2FUNC(id)   (((id) >> 8) & 0x7)
-#define ASC_PCI_MKID(bus, dev, func) ((((dev) & 0x1F) << 11) | (((func) & 0x7) << 8) | ((bus) & 0xFF))
 
 #define  ASC_DVCLIB_CALL_DONE     (1)
 #define  ASC_DVCLIB_CALL_FAILED   (0)
@@ -1378,9 +1376,7 @@ typedef struct asc_dvc_cfg {
        uchar max_tag_qng[ASC_MAX_TID + 1];
        uchar *overrun_buf;
        uchar sdtr_period_offset[ASC_MAX_TID + 1];
-       ushort pci_slot_info;
        uchar adapter_info[6];
-       struct device *dev;
 } ASC_DVC_CFG;
 
 #define ASC_DEF_DVC_CNTL       0xFFFF
@@ -1405,17 +1401,12 @@ typedef struct asc_dvc_cfg {
 
 struct asc_dvc_var;            /* Forward Declaration. */
 
-typedef void (*ASC_ISR_CALLBACK) (struct asc_dvc_var *, ASC_QDONE_INFO *);
-typedef int (*ASC_EXE_CALLBACK) (struct asc_dvc_var *, ASC_SCSI_Q *);
-
 typedef struct asc_dvc_var {
        PortAddr iop_base;
        ushort err_code;
        ushort dvc_cntl;
        ushort bug_fix_cntl;
        ushort bus_type;
-       ASC_ISR_CALLBACK isr_callback;
-       ASC_EXE_CALLBACK exe_callback;
        ASC_SCSI_BIT_ID_TYPE init_sdtr;
        ASC_SCSI_BIT_ID_TYPE sdtr_done;
        ASC_SCSI_BIT_ID_TYPE use_tagged_qng;
@@ -1831,7 +1822,6 @@ static void AscMemDWordCopyPtrToLram(PortAddr, ushort, uchar *, int);
 static void AscMemWordCopyPtrFromLram(PortAddr, ushort, uchar *, int);
 static ushort AscInitAscDvcVar(ASC_DVC_VAR *);
 static ushort AscInitFromEEP(ASC_DVC_VAR *);
-static ushort AscInitFromAscDvcVar(ASC_DVC_VAR *);
 static ushort AscInitMicroCodeVar(ASC_DVC_VAR *);
 static int AscTestExternalLram(ASC_DVC_VAR *);
 static uchar AscMsgOutSDTR(ASC_DVC_VAR *, uchar, uchar);
@@ -2289,10 +2279,8 @@ typedef struct adveep_38C1600_config {
 #define BIOS_CTRL_AIPP_DIS           0x2000
 
 #define ADV_3550_MEMSIZE   0x2000      /* 8 KB Internal Memory */
-#define ADV_3550_IOLEN     0x40        /* I/O Port Range in bytes */
 
 #define ADV_38C0800_MEMSIZE  0x4000    /* 16 KB Internal Memory */
-#define ADV_38C0800_IOLEN    0x100     /* I/O Port Range in bytes */
 
 /*
  * XXX - Since ASC38C1600 Rev.3 has a local RAM failure issue, there is
@@ -2302,8 +2290,6 @@ typedef struct adveep_38C1600_config {
  * #define ADV_38C1600_MEMSIZE  0x8000L   * 32 KB Internal Memory *
  */
 #define ADV_38C1600_MEMSIZE  0x4000    /* 16 KB Internal Memory */
-#define ADV_38C1600_IOLEN    0x100     /* I/O Port Range 256 bytes */
-#define ADV_38C1600_MEMLEN   0x1000    /* Memory Range 4KB bytes */
 
 /*
  * Byte I/O register address from base of 'iop_base'.
@@ -2825,24 +2811,14 @@ typedef struct adv_dvc_cfg {
        ushort control_flag;    /* Microcode Control Flag */
        ushort mcode_date;      /* Microcode date */
        ushort mcode_version;   /* Microcode version */
-       ushort pci_slot_info;   /* high byte device/function number */
-       /* bits 7-3 device num., bits 2-0 function num. */
-       /* low byte bus num. */
        ushort serial1;         /* EEPROM serial number word 1 */
        ushort serial2;         /* EEPROM serial number word 2 */
        ushort serial3;         /* EEPROM serial number word 3 */
-       struct device *dev;     /* pointer to the pci dev structure for this board */
 } ADV_DVC_CFG;
 
 struct adv_dvc_var;
 struct adv_scsi_req_q;
 
-typedef void (*ADV_ISR_CALLBACK)
- (struct adv_dvc_var *, struct adv_scsi_req_q *);
-
-typedef void (*ADV_ASYNC_CALLBACK)
- (struct adv_dvc_var *, uchar);
-
 /*
  * Adapter operation variable structure.
  *
@@ -2859,8 +2835,6 @@ typedef struct adv_dvc_var {
        AdvPortAddr iop_base;   /* I/O port address */
        ushort err_code;        /* fatal error code */
        ushort bios_ctrl;       /* BIOS control word, EEPROM word 12 */
-       ADV_ISR_CALLBACK isr_callback;
-       ADV_ASYNC_CALLBACK async_callback;
        ushort wdtr_able;       /* try WDTR for a device */
        ushort sdtr_able;       /* try SDTR for a device */
        ushort ultra_able;      /* try SDTR Ultra speed for a device */
@@ -3004,7 +2978,6 @@ static void DvcDelayMicroSecond(ADV_DVC_VAR *, ushort);
  */
 static int AdvExeScsiQueue(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *);
 static int AdvISR(ADV_DVC_VAR *);
-static int AdvInitGetConfig(ADV_DVC_VAR *);
 static int AdvInitAsc3550Driver(ADV_DVC_VAR *);
 static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *);
 static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *);
@@ -3601,6 +3574,7 @@ typedef struct adv_req {
  * field. It is guaranteed to be allocated from DMA-able memory.
  */
 typedef struct asc_board {
+       struct device *dev;
        int id;                 /* Board Id */
        uint flags;             /* Board flags */
        union {
@@ -3652,6 +3626,10 @@ typedef struct asc_board {
        ushort bios_codelen;    /* BIOS Code Segment Length. */
 } asc_board_t;
 
+#define adv_dvc_to_board(adv_dvc) container_of(adv_dvc, struct asc_board, \
+                                                       dvc_var.adv_dvc_var)
+#define adv_dvc_to_pdev(adv_dvc) to_pci_dev(adv_dvc_to_board(adv_dvc)->dev)
+
 /* Number of boards detected in system. */
 static int asc_board_count;
 
@@ -3678,9 +3656,6 @@ static int asc_execute_scsi_cmnd(struct scsi_cmnd *);
 static int asc_build_req(asc_board_t *, struct scsi_cmnd *);
 static int adv_build_req(asc_board_t *, struct scsi_cmnd *, ADV_SCSI_REQ_Q **);
 static int adv_get_sglist(asc_board_t *, adv_req_t *, struct scsi_cmnd *, int);
-static void asc_isr_callback(ASC_DVC_VAR *, ASC_QDONE_INFO *);
-static void adv_isr_callback(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *);
-static void adv_async_callback(ADV_DVC_VAR *, uchar);
 static void asc_enqueue(asc_queue_t *, REQP, int);
 static REQP asc_dequeue(asc_queue_t *, int);
 static REQP asc_dequeue_list(asc_queue_t *, REQP *, int);
@@ -3952,7 +3927,6 @@ static const char *advansys_info(struct Scsi_Host *shost)
        ASC_DVC_VAR *asc_dvc_varp;
        ADV_DVC_VAR *adv_dvc_varp;
        char *busname;
-       int iolen;
        char *widename = NULL;
 
        boardp = ASC_BOARDP(shost);
@@ -3966,13 +3940,12 @@ static const char *advansys_info(struct Scsi_Host *shost)
                        } else {
                                busname = "ISA";
                        }
-                       /* Don't reference 'shost->n_io_port'; It may be truncated. */
                        sprintf(info,
                                "AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X, DMA 0x%X",
                                ASC_VERSION, busname,
                                (ulong)shost->io_port,
-                               (ulong)shost->io_port + boardp->asc_n_io_port -
-                               1, shost->irq, shost->dma_channel);
+                               (ulong)shost->io_port + ASC_IOADR_GAP - 1,
+                               shost->irq, shost->dma_channel);
                } else {
                        if (asc_dvc_varp->bus_type & ASC_IS_VL) {
                                busname = "VL";
@@ -3991,12 +3964,11 @@ static const char *advansys_info(struct Scsi_Host *shost)
                                           "bus type %d\n", boardp->id,
                                           asc_dvc_varp->bus_type);
                        }
-                       /* Don't reference 'shost->n_io_port'; It may be truncated. */
                        sprintf(info,
                                "AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X",
                                ASC_VERSION, busname, (ulong)shost->io_port,
-                               (ulong)shost->io_port + boardp->asc_n_io_port -
-                               1, shost->irq);
+                               (ulong)shost->io_port + ASC_IOADR_GAP - 1,
+                               shost->irq);
                }
        } else {
                /*
@@ -4008,19 +3980,16 @@ static const char *advansys_info(struct Scsi_Host *shost)
                 */
                adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
                if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
-                       iolen = ADV_3550_IOLEN;
                        widename = "Ultra-Wide";
                } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
-                       iolen = ADV_38C0800_IOLEN;
                        widename = "Ultra2-Wide";
                } else {
-                       iolen = ADV_38C1600_IOLEN;
                        widename = "Ultra3-Wide";
                }
                sprintf(info,
                        "AdvanSys SCSI %s: PCI %s: PCIMEM 0x%lX-0x%lX, IRQ 0x%X",
                        ASC_VERSION, widename, (ulong)adv_dvc_varp->iop_base,
-                       (ulong)adv_dvc_varp->iop_base + iolen - 1, shost->irq);
+                       (ulong)adv_dvc_varp->iop_base + boardp->asc_n_io_port - 1, shost->irq);
        }
        ASC_ASSERT(strlen(info) < ASC_INFO_SIZE);
        ASC_DBG(1, "advansys_info: end\n");
@@ -4682,7 +4651,6 @@ static void asc_scsi_done_list(struct scsi_cmnd *scp)
        ASC_DBG(2, "asc_scsi_done_list: begin\n");
        while (scp != NULL) {
                asc_board_t *boardp;
-               struct device *dev;
 
                ASC_DBG1(3, "asc_scsi_done_list: scp 0x%lx\n", (ulong)scp);
                tscp = REQPNEXT(scp);
@@ -4690,17 +4658,12 @@ static void asc_scsi_done_list(struct scsi_cmnd *scp)
 
                boardp = ASC_BOARDP(scp->device->host);
 
-               if (ASC_NARROW_BOARD(boardp))
-                       dev = boardp->dvc_cfg.asc_dvc_cfg.dev;
-               else
-                       dev = boardp->dvc_cfg.adv_dvc_cfg.dev;
-
                if (scp->use_sg)
-                       dma_unmap_sg(dev,
+                       dma_unmap_sg(boardp->dev,
                                     (struct scatterlist *)scp->request_buffer,
                                     scp->use_sg, scp->sc_data_direction);
                else if (scp->request_bufflen)
-                       dma_unmap_single(dev, scp->SCp.dma_handle,
+                       dma_unmap_single(boardp->dev, scp->SCp.dma_handle,
                                         scp->request_bufflen,
                                         scp->sc_data_direction);
 
@@ -4939,8 +4902,6 @@ static int asc_execute_scsi_cmnd(struct scsi_cmnd *scp)
  */
 static int asc_build_req(asc_board_t *boardp, struct scsi_cmnd *scp)
 {
-       struct device *dev = boardp->dvc_cfg.asc_dvc_cfg.dev;
-
        /*
         * Mutually exclusive access is required to 'asc_scsi_q' and
         * 'asc_sg_head' until after the request is started.
@@ -5004,7 +4965,7 @@ static int asc_build_req(asc_board_t *boardp, struct scsi_cmnd *scp)
                 */
                ASC_STATS(scp->device->host, cont_cnt);
                scp->SCp.dma_handle = scp->request_bufflen ?
-                   dma_map_single(dev, scp->request_buffer,
+                   dma_map_single(boardp->dev, scp->request_buffer,
                                   scp->request_bufflen,
                                   scp->sc_data_direction) : 0;
                asc_scsi_q.q1.data_addr = cpu_to_le32(scp->SCp.dma_handle);
@@ -5022,15 +4983,14 @@ static int asc_build_req(asc_board_t *boardp, struct scsi_cmnd *scp)
                struct scatterlist *slp;
 
                slp = (struct scatterlist *)scp->request_buffer;
-               use_sg =
-                   dma_map_sg(dev, slp, scp->use_sg, scp->sc_data_direction);
+               use_sg = dma_map_sg(boardp->dev, slp, scp->use_sg,
+                                   scp->sc_data_direction);
 
                if (use_sg > scp->device->host->sg_tablesize) {
-                       ASC_PRINT3
-                           ("asc_build_req: board %d: use_sg %d > sg_tablesize %d\n",
-                            boardp->id, use_sg,
-                            scp->device->host->sg_tablesize);
-                       dma_unmap_sg(dev, slp, scp->use_sg,
+                       ASC_PRINT3("asc_build_req: board %d: use_sg %d > "
+                                  "sg_tablesize %d\n", boardp->id, use_sg,
+                                  scp->device->host->sg_tablesize);
+                       dma_unmap_sg(boardp->dev, slp, scp->use_sg,
                                     scp->sc_data_direction);
                        scp->result = HOST_BYTE(DID_ERROR);
                        asc_enqueue(&boardp->done, scp, ASC_BACK);
@@ -5091,7 +5051,6 @@ adv_build_req(asc_board_t *boardp, struct scsi_cmnd *scp,
        ADV_SCSI_REQ_Q *scsiqp;
        int i;
        int ret;
-       struct device *dev = boardp->dvc_cfg.adv_dvc_cfg.dev;
 
        /*
         * Allocate an adv_req_t structure from the board to execute
@@ -5178,7 +5137,7 @@ adv_build_req(asc_board_t *boardp, struct scsi_cmnd *scp,
                if (scp->request_bufflen) {
                        scsiqp->vdata_addr = scp->request_buffer;
                        scp->SCp.dma_handle =
-                           dma_map_single(dev, scp->request_buffer,
+                           dma_map_single(boardp->dev, scp->request_buffer,
                                           scp->request_bufflen,
                                           scp->sc_data_direction);
                } else {
@@ -5199,22 +5158,21 @@ adv_build_req(asc_board_t *boardp, struct scsi_cmnd *scp,
                int use_sg;
 
                slp = (struct scatterlist *)scp->request_buffer;
-               use_sg =
-                   dma_map_sg(dev, slp, scp->use_sg, scp->sc_data_direction);
+               use_sg = dma_map_sg(boardp->dev, slp, scp->use_sg,
+                                   scp->sc_data_direction);
 
                if (use_sg > ADV_MAX_SG_LIST) {
-                       ASC_PRINT3
-                           ("adv_build_req: board %d: use_sg %d > ADV_MAX_SG_LIST %d\n",
-                            boardp->id, use_sg,
-                            scp->device->host->sg_tablesize);
-                       dma_unmap_sg(dev, slp, scp->use_sg,
+                       ASC_PRINT3("adv_build_req: board %d: use_sg %d > "
+                                  "ADV_MAX_SG_LIST %d\n", boardp->id, use_sg,
+                                  scp->device->host->sg_tablesize);
+                       dma_unmap_sg(boardp->dev, slp, scp->use_sg,
                                     scp->sc_data_direction);
                        scp->result = HOST_BYTE(DID_ERROR);
                        asc_enqueue(&boardp->done, scp, ASC_BACK);
 
                        /*
-                        * Free the 'adv_req_t' structure by adding it back to the
-                        * board free list.
+                        * Free the 'adv_req_t' structure by adding it back
+                        * to the board free list.
                         */
                        reqp->next_reqp = boardp->adv_reqp;
                        boardp->adv_reqp = reqp;
@@ -5222,12 +5180,11 @@ adv_build_req(asc_board_t *boardp, struct scsi_cmnd *scp,
                        return ASC_ERROR;
                }
 
-               if ((ret =
-                    adv_get_sglist(boardp, reqp, scp,
-                                   use_sg)) != ADV_SUCCESS) {
+               ret = adv_get_sglist(boardp, reqp, scp, use_sg);
+               if (ret != ADV_SUCCESS) {
                        /*
-                        * Free the adv_req_t structure by adding it back to the
-                        * board free list.
+                        * Free the adv_req_t structure by adding it back to
+                        * the board free list.
                         */
                        reqp->next_reqp = boardp->adv_reqp;
                        boardp->adv_reqp = reqp;
@@ -6700,10 +6657,7 @@ static int asc_prt_driver_conf(struct Scsi_Host *shost, char *cp, int cplen)
                           boardp->asc_n_io_port);
        ASC_PRT_NEXT();
 
-       /* 'shost->n_io_port' may be truncated because it is only one byte. */
-       len = asc_prt_line(cp, leftlen,
-                          " io_port 0x%x, n_io_port 0x%x\n",
-                          shost->io_port, shost->n_io_port);
+       len = asc_prt_line(cp, leftlen, " io_port 0x%x\n", shost->io_port);
        ASC_PRT_NEXT();
 
        if (ASC_NARROW_BOARD(boardp)) {
@@ -7595,8 +7549,8 @@ static void asc_prt_scsi_host(struct Scsi_Host *s)
        printk(" host_busy %u, host_no %d, last_reset %d,\n",
               s->host_busy, s->host_no, (unsigned)s->last_reset);
 
-       printk(" base 0x%lx, io_port 0x%lx, n_io_port %u, irq 0x%x,\n",
-              (ulong)s->base, (ulong)s->io_port, s->n_io_port, s->irq);
+       printk(" base 0x%lx, io_port 0x%lx, irq 0x%x,\n",
+              (ulong)s->base, (ulong)s->io_port, s->irq);
 
        printk(" dma_channel %d, this_id %d, can_queue %d,\n",
               s->dma_channel, s->this_id, s->can_queue);
@@ -7652,9 +7606,8 @@ static void asc_prt_asc_dvc_var(ASC_DVC_VAR *h)
        printk(" iop_base 0x%x, err_code 0x%x, dvc_cntl 0x%x, bug_fix_cntl "
               "%d,\n", h->iop_base, h->err_code, h->dvc_cntl, h->bug_fix_cntl);
 
-       printk(" bus_type %d, isr_callback 0x%p, exe_callback 0x%p, "
-              "init_sdtr 0x%x,\n", h->bus_type, h->isr_callback,
-              h->exe_callback, (unsigned)h->init_sdtr);
+       printk(" bus_type %d, init_sdtr 0x%x,\n", h->bus_type,
+               (unsigned)h->init_sdtr);
 
        printk(" sdtr_done 0x%x, use_tagged_qng 0x%x, unit_not_ready 0x%x, "
               "chip_no 0x%x,\n", (unsigned)h->sdtr_done,
@@ -7809,8 +7762,7 @@ static void asc_prt_adv_dvc_cfg(ADV_DVC_CFG *h)
        printk("  mcode_version 0x%x, pci_device_id 0x%x, lib_version %u\n",
               h->mcode_version, to_pci_dev(h->dev)->device, h->lib_version);
 
-       printk("  control_flag 0x%x, pci_slot_info 0x%x\n",
-              h->control_flag, h->pci_slot_info);
+       printk("  control_flag 0x%x\n", h->control_flag);
 }
 
 /*
@@ -8659,10 +8611,8 @@ static int AscIsrQDone(ASC_DVC_VAR *asc_dvc)
        ASC_QDONE_INFO scsiq_buf;
        ASC_QDONE_INFO *scsiq;
        int false_overrun;
-       ASC_ISR_CALLBACK asc_isr_callback;
 
        iop_base = asc_dvc->iop_base;
-       asc_isr_callback = asc_dvc->isr_callback;
        n_q_used = 1;
        scsiq = (ASC_QDONE_INFO *)&scsiq_buf;
        done_q_tail = (uchar)AscGetVarDoneQTail(iop_base);
@@ -8774,7 +8724,7 @@ static int AscIsrQDone(ASC_DVC_VAR *asc_dvc)
                                }
                        }
                        if ((scsiq->cntl & QC_NO_CALLBACK) == 0) {
-                               (*asc_isr_callback) (asc_dvc, scsiq);
+                               asc_isr_callback(asc_dvc, scsiq);
                        } else {
                                if ((AscReadLramByte(iop_base,
                                                     (ushort)(q_addr + (ushort)
@@ -8792,7 +8742,7 @@ static int AscIsrQDone(ASC_DVC_VAR *asc_dvc)
                        AscSetLibErrorCode(asc_dvc, ASCQ_ERR_Q_STATUS);
  FATAL_ERR_QDONE:
                        if ((scsiq->cntl & QC_NO_CALLBACK) == 0) {
-                               (*asc_isr_callback) (asc_dvc, scsiq);
+                               asc_isr_callback(asc_dvc, scsiq);
                        }
                        return (0x80);
                }
@@ -8818,9 +8768,7 @@ static int AscISR(ASC_DVC_VAR *asc_dvc)
                return int_pending;
        }
 
-       if (((asc_dvc->init_state & ASC_INIT_STATE_END_LOAD_MC) == 0)
-           || (asc_dvc->isr_callback == 0)
-           ) {
+       if ((asc_dvc->init_state & ASC_INIT_STATE_END_LOAD_MC) == 0) {
                return (ERR);
        }
        if (asc_dvc->in_critical_cnt != 0) {
@@ -9219,7 +9167,6 @@ static int AscExeScsiQueue(ASC_DVC_VAR *asc_dvc, ASC_SCSI_Q *scsiq)
        int disable_syn_offset_one_fix;
        int i;
        ASC_PADDR addr;
-       ASC_EXE_CALLBACK asc_exe_callback;
        ushort sg_entry_cnt = 0;
        ushort sg_entry_cnt_minus_one = 0;
        uchar target_ix;
@@ -9233,7 +9180,6 @@ static int AscExeScsiQueue(ASC_DVC_VAR *asc_dvc, ASC_SCSI_Q *scsiq)
 
        iop_base = asc_dvc->iop_base;
        sg_head = scsiq->sg_head;
-       asc_exe_callback = asc_dvc->exe_callback;
        if (asc_dvc->err_code != 0)
                return (ERR);
        if (scsiq == (ASC_SCSI_Q *)0L) {
@@ -9394,9 +9340,6 @@ static int AscExeScsiQueue(ASC_DVC_VAR *asc_dvc, ASC_SCSI_Q *scsiq)
                             AscSendScsiQueue(asc_dvc, scsiq,
                                              n_q_required)) == 1) {
                                asc_dvc->in_critical_cnt--;
-                               if (asc_exe_callback != 0) {
-                                       (*asc_exe_callback) (asc_dvc, scsiq);
-                               }
                                DvcLeaveCritical(last_int_level);
                                return (sta);
                        }
@@ -9442,9 +9385,6 @@ static int AscExeScsiQueue(ASC_DVC_VAR *asc_dvc, ASC_SCSI_Q *scsiq)
                        if ((sta = AscSendScsiQueue(asc_dvc, scsiq,
                                                    n_q_required)) == 1) {
                                asc_dvc->in_critical_cnt--;
-                               if (asc_exe_callback != 0) {
-                                       (*asc_exe_callback) (asc_dvc, scsiq);
-                               }
                                DvcLeaveCritical(last_int_level);
                                return (sta);
                        }
@@ -10232,30 +10172,21 @@ static ushort __devinit AscInitGetConfig(ASC_DVC_VAR *asc_dvc)
        return warn_code;
 }
 
-static ushort __devinit AscInitSetConfig(ASC_DVC_VAR *asc_dvc)
+static unsigned short __devinit
+AscInitSetConfig(struct pci_dev *pdev, ASC_DVC_VAR *asc_dvc)
 {
-       ushort warn_code = 0;
+       PortAddr iop_base = asc_dvc->iop_base;
+       unsigned short cfg_msw;
+       unsigned short warn_code = 0;
 
        asc_dvc->init_state |= ASC_INIT_STATE_BEG_SET_CFG;
        if (asc_dvc->err_code != 0)
-               return (UW_ERR);
-       if (AscFindSignature(asc_dvc->iop_base)) {
-               warn_code |= AscInitFromAscDvcVar(asc_dvc);
-               asc_dvc->init_state |= ASC_INIT_STATE_END_SET_CFG;
-       } else {
+               return UW_ERR;
+       if (!AscFindSignature(asc_dvc->iop_base)) {
                asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
+               return 0;
        }
-       return (warn_code);
-}
-
-static ushort __devinit AscInitFromAscDvcVar(ASC_DVC_VAR *asc_dvc)
-{
-       PortAddr iop_base;
-       ushort cfg_msw;
-       ushort warn_code;
 
-       iop_base = asc_dvc->iop_base;
-       warn_code = 0;
        cfg_msw = AscGetChipCfgMsw(iop_base);
        if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) {
                cfg_msw &= (~(ASC_CFG_MSW_CLR_MASK));
@@ -10278,7 +10209,6 @@ static ushort __devinit AscInitFromAscDvcVar(ASC_DVC_VAR *asc_dvc)
        }
 #ifdef CONFIG_PCI
        if (asc_dvc->bus_type & ASC_IS_PCI) {
-               struct pci_dev *pdev = to_pci_dev(asc_dvc->cfg->dev);
                cfg_msw &= 0xFFC0;
                AscSetChipCfgMsw(iop_base, cfg_msw);
                if ((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) == ASC_IS_PCI_ULTRA) {
@@ -10308,7 +10238,9 @@ static ushort __devinit AscInitFromAscDvcVar(ASC_DVC_VAR *asc_dvc)
                AscSetIsaDmaSpeed(iop_base, asc_dvc->cfg->isa_dma_speed);
        }
 #endif /* CONFIG_ISA */
-       return (warn_code);
+
+       asc_dvc->init_state |= ASC_INIT_STATE_END_SET_CFG;
+       return warn_code;
 }
 
 static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc)
@@ -13612,11 +13544,11 @@ static ADVEEP_38C1600_CONFIG ADVEEP_38C1600_Config_Field_IsChar __devinitdata =
  * For a non-fatal error return a warning code. If there are no warnings
  * then 0 is returned.
  */
-static int __devinit AdvInitGetConfig(ADV_DVC_VAR *asc_dvc)
+static int __devinit
+AdvInitGetConfig(struct pci_dev *pdev, ADV_DVC_VAR *asc_dvc)
 {
        unsigned short warn_code = 0;
        AdvPortAddr iop_base = asc_dvc->iop_base;
-       struct pci_dev *pdev = to_pci_dev(asc_dvc->cfg->dev);
        u16 cmd;
        int status;
 
@@ -15266,6 +15198,7 @@ static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *asc_dvc)
         * ready to be 'ored' into SCSI_CFG1.
         */
        if ((asc_dvc->cfg->termination & TERM_SE) == 0) {
+               struct pci_dev *pdev = adv_dvc_to_pdev(asc_dvc);
                /* SE automatic termination control is enabled. */
                switch (scsi_cfg1 & C_DET_SE) {
                        /* TERM_SE_HI: on, TERM_SE_LO: on */
@@ -15276,7 +15209,7 @@ static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *asc_dvc)
                        break;
 
                case 0x0:
-                       if (ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info) == 0) {
+                       if (PCI_FUNC(pdev->devfn) == 0) {
                                /* Function 0 - TERM_SE_HI: off, TERM_SE_LO: off */
                        } else {
                                /* Function 1 - TERM_SE_HI: on, TERM_SE_LO: off */
@@ -15882,15 +15815,14 @@ static int __devinit AdvInitFrom38C1600EEP(ADV_DVC_VAR *asc_dvc)
         */
        if (AdvGet38C1600EEPConfig(iop_base, &eep_config) !=
            eep_config.check_sum) {
+               struct pci_dev *pdev = adv_dvc_to_pdev(asc_dvc);
                warn_code |= ASC_WARN_EEPROM_CHKSUM;
 
                /*
                 * Set EEPROM default values.
                 */
                for (i = 0; i < sizeof(ADVEEP_38C1600_CONFIG); i++) {
-                       if (i == 1
-                           && ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info) !=
-                           0) {
+                       if (i == 1 && PCI_FUNC(pdev->devfn) != 0) {
                                /*
                                 * Set Function 1 EEPROM Word 0 MSB
                                 *
@@ -16781,7 +16713,7 @@ static int AdvISR(ADV_DVC_VAR *asc_dvc)
 
        /*
         * Notify the driver of an asynchronous microcode condition by
-        * calling the ADV_DVC_VAR.async_callback function. The function
+        * calling the adv_async_callback function. The function
         * is passed the microcode ASC_MC_INTRB_CODE byte value.
         */
        if (int_stat & ADV_INTR_STATUS_INTRB) {
@@ -16803,9 +16735,7 @@ static int AdvISR(ADV_DVC_VAR *asc_dvc)
                        }
                }
 
-               if (asc_dvc->async_callback != 0) {
-                       (*asc_dvc->async_callback) (asc_dvc, intrb_code);
-               }
+               adv_async_callback(asc_dvc, intrb_code);
        }
 
        /*
@@ -16863,7 +16793,7 @@ static int AdvISR(ADV_DVC_VAR *asc_dvc)
                 * the ADV_SCSI_REQ_Q pointer to its callback function.
                 */
                scsiq->a_flag |= ADV_SCSIQ_DONE;
-               (*asc_dvc->isr_callback) (asc_dvc, scsiq);
+               adv_isr_callback(asc_dvc, scsiq);
                /*
                 * Note: After the driver callback function is called, 'scsiq'
                 * can no longer be referenced.
@@ -17107,6 +17037,7 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
        memset(boardp, 0, sizeof(asc_board_t));
        boardp->id = asc_board_count++;
        spin_lock_init(&boardp->lock);
+       boardp->dev = dev;
 
        /*
         * Handle both narrow and wide boards.
@@ -17132,15 +17063,12 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
                asc_dvc_varp->cfg = &boardp->dvc_cfg.asc_dvc_cfg;
                asc_dvc_varp->cfg->overrun_buf = &overrun_buf[0];
                asc_dvc_varp->iop_base = iop;
-               asc_dvc_varp->isr_callback = asc_isr_callback;
        } else {
 #ifdef CONFIG_PCI
                ASC_DBG(1, "advansys_board_found: wide board\n");
                adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
                adv_dvc_varp->drv_ptr = boardp;
                adv_dvc_varp->cfg = &boardp->dvc_cfg.adv_dvc_cfg;
-               adv_dvc_varp->isr_callback = adv_isr_callback;
-               adv_dvc_varp->async_callback = adv_async_callback;
                if (pdev->device == PCI_DEVICE_ID_ASP_ABP940UW) {
                        ASC_DBG(1, "advansys_board_found: ASC-3550\n");
                        adv_dvc_varp->chip_type = ADV_CHIP_ASC3550;
@@ -17193,7 +17121,6 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
 #endif /* CONFIG_PROC_FS */
 
        if (ASC_NARROW_BOARD(boardp)) {
-               asc_dvc_varp->cfg->dev = dev;
                /*
                 * Set the board bus type and PCI IRQ before
                 * calling AscInitGetConfig().
@@ -17216,10 +17143,6 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
 #ifdef CONFIG_PCI
                case ASC_IS_PCI:
                        shost->irq = asc_dvc_varp->irq_no = pdev->irq;
-                       asc_dvc_varp->cfg->pci_slot_info =
-                           ASC_PCI_MKID(pdev->bus->number,
-                                        PCI_SLOT(pdev->devfn),
-                                        PCI_FUNC(pdev->devfn));
                        shost->unchecked_isa_dma = FALSE;
                        share_irq = IRQF_SHARED;
                        break;
@@ -17233,17 +17156,12 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
                        break;
                }
        } else {
-               adv_dvc_varp->cfg->dev = dev;
                /*
                 * For Wide boards set PCI information before calling
                 * AdvInitGetConfig().
                 */
 #ifdef CONFIG_PCI
                shost->irq = adv_dvc_varp->irq_no = pdev->irq;
-               adv_dvc_varp->cfg->pci_slot_info =
-                   ASC_PCI_MKID(pdev->bus->number,
-                                PCI_SLOT(pdev->devfn),
-                                PCI_FUNC(pdev->devfn));
                shost->unchecked_isa_dma = FALSE;
                share_irq = IRQF_SHARED;
 #endif /* CONFIG_PCI */
@@ -17302,7 +17220,9 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
                }
        } else {
                ASC_DBG(2, "advansys_board_found: AdvInitGetConfig()\n");
-               if ((ret = AdvInitGetConfig(adv_dvc_varp)) != 0) {
+
+               ret = AdvInitGetConfig(pdev, adv_dvc_varp);
+               if (ret != 0) {
                        ASC_PRINT2
                            ("AdvInitGetConfig: board %d: warning: 0x%x\n",
                             boardp->id, ret);
@@ -17358,7 +17278,7 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
                 * Modify board configuration.
                 */
                ASC_DBG(2, "advansys_board_found: AscInitSetConfig()\n");
-               switch (ret = AscInitSetConfig(asc_dvc_varp)) {
+               switch (ret = AscInitSetConfig(pdev, asc_dvc_varp)) {
                case 0: /* No error. */
                        break;
                case ASC_WARN_IO_PORT_ROTATE:
@@ -17536,15 +17456,6 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
                shost->can_queue = adv_dvc_varp->max_host_qng;
        }
 
-       /*
-        * 'n_io_port' currently is one byte.
-        *
-        * Set a value to 'n_io_port', but never referenced it because
-        * it may be truncated.
-        */
-       shost->n_io_port = boardp->asc_n_io_port <= 255 ?
-           boardp->asc_n_io_port : 255;
-
        /*
         * Following v1.3.89, 'cmd_per_lun' is no longer needed
         * and should be set to zero.