提交 394dbf3f 编写于 作者: M Matthew Wilcox 提交者: James Bottomley

[SCSI] advansys: Move struct device out of the cfg structures

The cfg structures are supposed to be disposable after initialisation;
with the 'dev' used for DMA mapping in there, that's not possible.  Move
the dev to the board.

Also inline AscInitFromAscDvcVar into its only caller, remove some
unnecessary prototypes and sort out a few minor formatting issues.
Signed-off-by: NMatthew Wilcox <matthew@wil.cx>
Signed-off-by: NJames Bottomley <James.Bottomley@SteelEye.com>
上级 4a2d31c8
...@@ -1380,7 +1380,6 @@ typedef struct asc_dvc_cfg { ...@@ -1380,7 +1380,6 @@ typedef struct asc_dvc_cfg {
uchar sdtr_period_offset[ASC_MAX_TID + 1]; uchar sdtr_period_offset[ASC_MAX_TID + 1];
ushort pci_slot_info; ushort pci_slot_info;
uchar adapter_info[6]; uchar adapter_info[6];
struct device *dev;
} ASC_DVC_CFG; } ASC_DVC_CFG;
#define ASC_DEF_DVC_CNTL 0xFFFF #define ASC_DEF_DVC_CNTL 0xFFFF
...@@ -1831,7 +1830,6 @@ static void AscMemDWordCopyPtrToLram(PortAddr, ushort, uchar *, int); ...@@ -1831,7 +1830,6 @@ static void AscMemDWordCopyPtrToLram(PortAddr, ushort, uchar *, int);
static void AscMemWordCopyPtrFromLram(PortAddr, ushort, uchar *, int); static void AscMemWordCopyPtrFromLram(PortAddr, ushort, uchar *, int);
static ushort AscInitAscDvcVar(ASC_DVC_VAR *); static ushort AscInitAscDvcVar(ASC_DVC_VAR *);
static ushort AscInitFromEEP(ASC_DVC_VAR *); static ushort AscInitFromEEP(ASC_DVC_VAR *);
static ushort AscInitFromAscDvcVar(ASC_DVC_VAR *);
static ushort AscInitMicroCodeVar(ASC_DVC_VAR *); static ushort AscInitMicroCodeVar(ASC_DVC_VAR *);
static int AscTestExternalLram(ASC_DVC_VAR *); static int AscTestExternalLram(ASC_DVC_VAR *);
static uchar AscMsgOutSDTR(ASC_DVC_VAR *, uchar, uchar); static uchar AscMsgOutSDTR(ASC_DVC_VAR *, uchar, uchar);
...@@ -2827,7 +2825,6 @@ typedef struct adv_dvc_cfg { ...@@ -2827,7 +2825,6 @@ typedef struct adv_dvc_cfg {
ushort serial1; /* EEPROM serial number word 1 */ ushort serial1; /* EEPROM serial number word 1 */
ushort serial2; /* EEPROM serial number word 2 */ ushort serial2; /* EEPROM serial number word 2 */
ushort serial3; /* EEPROM serial number word 3 */ ushort serial3; /* EEPROM serial number word 3 */
struct device *dev; /* pointer to the pci dev structure for this board */
} ADV_DVC_CFG; } ADV_DVC_CFG;
struct adv_dvc_var; struct adv_dvc_var;
...@@ -3000,7 +2997,6 @@ static void DvcDelayMicroSecond(ADV_DVC_VAR *, ushort); ...@@ -3000,7 +2997,6 @@ static void DvcDelayMicroSecond(ADV_DVC_VAR *, ushort);
*/ */
static int AdvExeScsiQueue(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *); static int AdvExeScsiQueue(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *);
static int AdvISR(ADV_DVC_VAR *); static int AdvISR(ADV_DVC_VAR *);
static int AdvInitGetConfig(ADV_DVC_VAR *);
static int AdvInitAsc3550Driver(ADV_DVC_VAR *); static int AdvInitAsc3550Driver(ADV_DVC_VAR *);
static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *); static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *);
static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *); static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *);
...@@ -3597,6 +3593,7 @@ typedef struct adv_req { ...@@ -3597,6 +3593,7 @@ typedef struct adv_req {
* field. It is guaranteed to be allocated from DMA-able memory. * field. It is guaranteed to be allocated from DMA-able memory.
*/ */
typedef struct asc_board { typedef struct asc_board {
struct device *dev;
int id; /* Board Id */ int id; /* Board Id */
uint flags; /* Board flags */ uint flags; /* Board flags */
union { union {
...@@ -4672,7 +4669,6 @@ static void asc_scsi_done_list(struct scsi_cmnd *scp) ...@@ -4672,7 +4669,6 @@ static void asc_scsi_done_list(struct scsi_cmnd *scp)
ASC_DBG(2, "asc_scsi_done_list: begin\n"); ASC_DBG(2, "asc_scsi_done_list: begin\n");
while (scp != NULL) { while (scp != NULL) {
asc_board_t *boardp; asc_board_t *boardp;
struct device *dev;
ASC_DBG1(3, "asc_scsi_done_list: scp 0x%lx\n", (ulong)scp); ASC_DBG1(3, "asc_scsi_done_list: scp 0x%lx\n", (ulong)scp);
tscp = REQPNEXT(scp); tscp = REQPNEXT(scp);
...@@ -4680,17 +4676,12 @@ static void asc_scsi_done_list(struct scsi_cmnd *scp) ...@@ -4680,17 +4676,12 @@ static void asc_scsi_done_list(struct scsi_cmnd *scp)
boardp = ASC_BOARDP(scp->device->host); 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) if (scp->use_sg)
dma_unmap_sg(dev, dma_unmap_sg(boardp->dev,
(struct scatterlist *)scp->request_buffer, (struct scatterlist *)scp->request_buffer,
scp->use_sg, scp->sc_data_direction); scp->use_sg, scp->sc_data_direction);
else if (scp->request_bufflen) 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->request_bufflen,
scp->sc_data_direction); scp->sc_data_direction);
...@@ -4929,8 +4920,6 @@ static int asc_execute_scsi_cmnd(struct scsi_cmnd *scp) ...@@ -4929,8 +4920,6 @@ static int asc_execute_scsi_cmnd(struct scsi_cmnd *scp)
*/ */
static int asc_build_req(asc_board_t *boardp, 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 * Mutually exclusive access is required to 'asc_scsi_q' and
* 'asc_sg_head' until after the request is started. * 'asc_sg_head' until after the request is started.
...@@ -4994,7 +4983,7 @@ static int asc_build_req(asc_board_t *boardp, struct scsi_cmnd *scp) ...@@ -4994,7 +4983,7 @@ static int asc_build_req(asc_board_t *boardp, struct scsi_cmnd *scp)
*/ */
ASC_STATS(scp->device->host, cont_cnt); ASC_STATS(scp->device->host, cont_cnt);
scp->SCp.dma_handle = scp->request_bufflen ? 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->request_bufflen,
scp->sc_data_direction) : 0; scp->sc_data_direction) : 0;
asc_scsi_q.q1.data_addr = cpu_to_le32(scp->SCp.dma_handle); asc_scsi_q.q1.data_addr = cpu_to_le32(scp->SCp.dma_handle);
...@@ -5012,15 +5001,14 @@ static int asc_build_req(asc_board_t *boardp, struct scsi_cmnd *scp) ...@@ -5012,15 +5001,14 @@ static int asc_build_req(asc_board_t *boardp, struct scsi_cmnd *scp)
struct scatterlist *slp; struct scatterlist *slp;
slp = (struct scatterlist *)scp->request_buffer; slp = (struct scatterlist *)scp->request_buffer;
use_sg = use_sg = dma_map_sg(boardp->dev, slp, scp->use_sg,
dma_map_sg(dev, slp, scp->use_sg, scp->sc_data_direction); scp->sc_data_direction);
if (use_sg > scp->device->host->sg_tablesize) { if (use_sg > scp->device->host->sg_tablesize) {
ASC_PRINT3 ASC_PRINT3("asc_build_req: board %d: use_sg %d > "
("asc_build_req: board %d: use_sg %d > sg_tablesize %d\n", "sg_tablesize %d\n", boardp->id, use_sg,
boardp->id, use_sg, scp->device->host->sg_tablesize);
scp->device->host->sg_tablesize); dma_unmap_sg(boardp->dev, slp, scp->use_sg,
dma_unmap_sg(dev, slp, scp->use_sg,
scp->sc_data_direction); scp->sc_data_direction);
scp->result = HOST_BYTE(DID_ERROR); scp->result = HOST_BYTE(DID_ERROR);
asc_enqueue(&boardp->done, scp, ASC_BACK); asc_enqueue(&boardp->done, scp, ASC_BACK);
...@@ -5081,7 +5069,6 @@ adv_build_req(asc_board_t *boardp, struct scsi_cmnd *scp, ...@@ -5081,7 +5069,6 @@ adv_build_req(asc_board_t *boardp, struct scsi_cmnd *scp,
ADV_SCSI_REQ_Q *scsiqp; ADV_SCSI_REQ_Q *scsiqp;
int i; int i;
int ret; int ret;
struct device *dev = boardp->dvc_cfg.adv_dvc_cfg.dev;
/* /*
* Allocate an adv_req_t structure from the board to execute * Allocate an adv_req_t structure from the board to execute
...@@ -5168,7 +5155,7 @@ adv_build_req(asc_board_t *boardp, struct scsi_cmnd *scp, ...@@ -5168,7 +5155,7 @@ adv_build_req(asc_board_t *boardp, struct scsi_cmnd *scp,
if (scp->request_bufflen) { if (scp->request_bufflen) {
scsiqp->vdata_addr = scp->request_buffer; scsiqp->vdata_addr = scp->request_buffer;
scp->SCp.dma_handle = scp->SCp.dma_handle =
dma_map_single(dev, scp->request_buffer, dma_map_single(boardp->dev, scp->request_buffer,
scp->request_bufflen, scp->request_bufflen,
scp->sc_data_direction); scp->sc_data_direction);
} else { } else {
...@@ -5189,22 +5176,21 @@ adv_build_req(asc_board_t *boardp, struct scsi_cmnd *scp, ...@@ -5189,22 +5176,21 @@ adv_build_req(asc_board_t *boardp, struct scsi_cmnd *scp,
int use_sg; int use_sg;
slp = (struct scatterlist *)scp->request_buffer; slp = (struct scatterlist *)scp->request_buffer;
use_sg = use_sg = dma_map_sg(boardp->dev, slp, scp->use_sg,
dma_map_sg(dev, slp, scp->use_sg, scp->sc_data_direction); scp->sc_data_direction);
if (use_sg > ADV_MAX_SG_LIST) { if (use_sg > ADV_MAX_SG_LIST) {
ASC_PRINT3 ASC_PRINT3("adv_build_req: board %d: use_sg %d > "
("adv_build_req: board %d: use_sg %d > ADV_MAX_SG_LIST %d\n", "ADV_MAX_SG_LIST %d\n", boardp->id, use_sg,
boardp->id, use_sg, scp->device->host->sg_tablesize);
scp->device->host->sg_tablesize); dma_unmap_sg(boardp->dev, slp, scp->use_sg,
dma_unmap_sg(dev, slp, scp->use_sg,
scp->sc_data_direction); scp->sc_data_direction);
scp->result = HOST_BYTE(DID_ERROR); scp->result = HOST_BYTE(DID_ERROR);
asc_enqueue(&boardp->done, scp, ASC_BACK); asc_enqueue(&boardp->done, scp, ASC_BACK);
/* /*
* Free the 'adv_req_t' structure by adding it back to the * Free the 'adv_req_t' structure by adding it back
* board free list. * to the board free list.
*/ */
reqp->next_reqp = boardp->adv_reqp; reqp->next_reqp = boardp->adv_reqp;
boardp->adv_reqp = reqp; boardp->adv_reqp = reqp;
...@@ -5212,12 +5198,11 @@ adv_build_req(asc_board_t *boardp, struct scsi_cmnd *scp, ...@@ -5212,12 +5198,11 @@ adv_build_req(asc_board_t *boardp, struct scsi_cmnd *scp,
return ASC_ERROR; return ASC_ERROR;
} }
if ((ret = ret = adv_get_sglist(boardp, reqp, scp, use_sg);
adv_get_sglist(boardp, reqp, scp, if (ret != ADV_SUCCESS) {
use_sg)) != ADV_SUCCESS) {
/* /*
* Free the adv_req_t structure by adding it back to the * Free the adv_req_t structure by adding it back to
* board free list. * the board free list.
*/ */
reqp->next_reqp = boardp->adv_reqp; reqp->next_reqp = boardp->adv_reqp;
boardp->adv_reqp = reqp; boardp->adv_reqp = reqp;
...@@ -10219,30 +10204,21 @@ static ushort __devinit AscInitGetConfig(ASC_DVC_VAR *asc_dvc) ...@@ -10219,30 +10204,21 @@ static ushort __devinit AscInitGetConfig(ASC_DVC_VAR *asc_dvc)
return warn_code; 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; asc_dvc->init_state |= ASC_INIT_STATE_BEG_SET_CFG;
if (asc_dvc->err_code != 0) if (asc_dvc->err_code != 0)
return (UW_ERR); return UW_ERR;
if (AscFindSignature(asc_dvc->iop_base)) { if (!AscFindSignature(asc_dvc->iop_base)) {
warn_code |= AscInitFromAscDvcVar(asc_dvc);
asc_dvc->init_state |= ASC_INIT_STATE_END_SET_CFG;
} else {
asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE; 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); cfg_msw = AscGetChipCfgMsw(iop_base);
if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) { if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) {
cfg_msw &= (~(ASC_CFG_MSW_CLR_MASK)); cfg_msw &= (~(ASC_CFG_MSW_CLR_MASK));
...@@ -10265,7 +10241,6 @@ static ushort __devinit AscInitFromAscDvcVar(ASC_DVC_VAR *asc_dvc) ...@@ -10265,7 +10241,6 @@ static ushort __devinit AscInitFromAscDvcVar(ASC_DVC_VAR *asc_dvc)
} }
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
if (asc_dvc->bus_type & ASC_IS_PCI) { if (asc_dvc->bus_type & ASC_IS_PCI) {
struct pci_dev *pdev = to_pci_dev(asc_dvc->cfg->dev);
cfg_msw &= 0xFFC0; cfg_msw &= 0xFFC0;
AscSetChipCfgMsw(iop_base, cfg_msw); AscSetChipCfgMsw(iop_base, cfg_msw);
if ((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) == ASC_IS_PCI_ULTRA) { if ((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) == ASC_IS_PCI_ULTRA) {
...@@ -10295,7 +10270,9 @@ static ushort __devinit AscInitFromAscDvcVar(ASC_DVC_VAR *asc_dvc) ...@@ -10295,7 +10270,9 @@ static ushort __devinit AscInitFromAscDvcVar(ASC_DVC_VAR *asc_dvc)
AscSetIsaDmaSpeed(iop_base, asc_dvc->cfg->isa_dma_speed); AscSetIsaDmaSpeed(iop_base, asc_dvc->cfg->isa_dma_speed);
} }
#endif /* CONFIG_ISA */ #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) static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc)
...@@ -13599,11 +13576,11 @@ static ADVEEP_38C1600_CONFIG ADVEEP_38C1600_Config_Field_IsChar __devinitdata = ...@@ -13599,11 +13576,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 * For a non-fatal error return a warning code. If there are no warnings
* then 0 is returned. * 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; unsigned short warn_code = 0;
AdvPortAddr iop_base = asc_dvc->iop_base; AdvPortAddr iop_base = asc_dvc->iop_base;
struct pci_dev *pdev = to_pci_dev(asc_dvc->cfg->dev);
u16 cmd; u16 cmd;
int status; int status;
...@@ -17094,6 +17071,7 @@ advansys_board_found(int iop, struct device *dev, int bus_type) ...@@ -17094,6 +17071,7 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
memset(boardp, 0, sizeof(asc_board_t)); memset(boardp, 0, sizeof(asc_board_t));
boardp->id = asc_board_count++; boardp->id = asc_board_count++;
spin_lock_init(&boardp->lock); spin_lock_init(&boardp->lock);
boardp->dev = dev;
/* /*
* Handle both narrow and wide boards. * Handle both narrow and wide boards.
...@@ -17180,7 +17158,6 @@ advansys_board_found(int iop, struct device *dev, int bus_type) ...@@ -17180,7 +17158,6 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
#endif /* CONFIG_PROC_FS */ #endif /* CONFIG_PROC_FS */
if (ASC_NARROW_BOARD(boardp)) { if (ASC_NARROW_BOARD(boardp)) {
asc_dvc_varp->cfg->dev = dev;
/* /*
* Set the board bus type and PCI IRQ before * Set the board bus type and PCI IRQ before
* calling AscInitGetConfig(). * calling AscInitGetConfig().
...@@ -17220,7 +17197,6 @@ advansys_board_found(int iop, struct device *dev, int bus_type) ...@@ -17220,7 +17197,6 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
break; break;
} }
} else { } else {
adv_dvc_varp->cfg->dev = dev;
/* /*
* For Wide boards set PCI information before calling * For Wide boards set PCI information before calling
* AdvInitGetConfig(). * AdvInitGetConfig().
...@@ -17289,7 +17265,9 @@ advansys_board_found(int iop, struct device *dev, int bus_type) ...@@ -17289,7 +17265,9 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
} }
} else { } else {
ASC_DBG(2, "advansys_board_found: AdvInitGetConfig()\n"); 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 ASC_PRINT2
("AdvInitGetConfig: board %d: warning: 0x%x\n", ("AdvInitGetConfig: board %d: warning: 0x%x\n",
boardp->id, ret); boardp->id, ret);
...@@ -17345,7 +17323,7 @@ advansys_board_found(int iop, struct device *dev, int bus_type) ...@@ -17345,7 +17323,7 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
* Modify board configuration. * Modify board configuration.
*/ */
ASC_DBG(2, "advansys_board_found: AscInitSetConfig()\n"); 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. */ case 0: /* No error. */
break; break;
case ASC_WARN_IO_PORT_ROTATE: case ASC_WARN_IO_PORT_ROTATE:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册