aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/advansys.c
diff options
context:
space:
mode:
authorMatthew Wilcox <matthew@wil.cx>2007-07-26 11:56:40 -0400
committerJames Bottomley <jejb@mulgrave.localdomain>2007-10-12 14:39:41 -0400
commit394dbf3f4005622fa52f1805eb950f08ce20f636 (patch)
treeebfe29af705e696dce211128016f843ff26b8dbf /drivers/scsi/advansys.c
parent4a2d31c811542d37258b3976975395cb1c0fba1c (diff)
[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: Matthew Wilcox <matthew@wil.cx> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/advansys.c')
-rw-r--r--drivers/scsi/advansys.c104
1 files changed, 41 insertions, 63 deletions
diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c
index e79f7955f6ea..73d974a15fca 100644
--- a/drivers/scsi/advansys.c
+++ b/drivers/scsi/advansys.c
@@ -1380,7 +1380,6 @@ typedef struct asc_dvc_cfg {
1380 uchar sdtr_period_offset[ASC_MAX_TID + 1]; 1380 uchar sdtr_period_offset[ASC_MAX_TID + 1];
1381 ushort pci_slot_info; 1381 ushort pci_slot_info;
1382 uchar adapter_info[6]; 1382 uchar adapter_info[6];
1383 struct device *dev;
1384} ASC_DVC_CFG; 1383} ASC_DVC_CFG;
1385 1384
1386#define ASC_DEF_DVC_CNTL 0xFFFF 1385#define ASC_DEF_DVC_CNTL 0xFFFF
@@ -1831,7 +1830,6 @@ static void AscMemDWordCopyPtrToLram(PortAddr, ushort, uchar *, int);
1831static void AscMemWordCopyPtrFromLram(PortAddr, ushort, uchar *, int); 1830static void AscMemWordCopyPtrFromLram(PortAddr, ushort, uchar *, int);
1832static ushort AscInitAscDvcVar(ASC_DVC_VAR *); 1831static ushort AscInitAscDvcVar(ASC_DVC_VAR *);
1833static ushort AscInitFromEEP(ASC_DVC_VAR *); 1832static ushort AscInitFromEEP(ASC_DVC_VAR *);
1834static ushort AscInitFromAscDvcVar(ASC_DVC_VAR *);
1835static ushort AscInitMicroCodeVar(ASC_DVC_VAR *); 1833static ushort AscInitMicroCodeVar(ASC_DVC_VAR *);
1836static int AscTestExternalLram(ASC_DVC_VAR *); 1834static int AscTestExternalLram(ASC_DVC_VAR *);
1837static uchar AscMsgOutSDTR(ASC_DVC_VAR *, uchar, uchar); 1835static uchar AscMsgOutSDTR(ASC_DVC_VAR *, uchar, uchar);
@@ -2827,7 +2825,6 @@ typedef struct adv_dvc_cfg {
2827 ushort serial1; /* EEPROM serial number word 1 */ 2825 ushort serial1; /* EEPROM serial number word 1 */
2828 ushort serial2; /* EEPROM serial number word 2 */ 2826 ushort serial2; /* EEPROM serial number word 2 */
2829 ushort serial3; /* EEPROM serial number word 3 */ 2827 ushort serial3; /* EEPROM serial number word 3 */
2830 struct device *dev; /* pointer to the pci dev structure for this board */
2831} ADV_DVC_CFG; 2828} ADV_DVC_CFG;
2832 2829
2833struct adv_dvc_var; 2830struct adv_dvc_var;
@@ -3000,7 +2997,6 @@ static void DvcDelayMicroSecond(ADV_DVC_VAR *, ushort);
3000 */ 2997 */
3001static int AdvExeScsiQueue(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *); 2998static int AdvExeScsiQueue(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *);
3002static int AdvISR(ADV_DVC_VAR *); 2999static int AdvISR(ADV_DVC_VAR *);
3003static int AdvInitGetConfig(ADV_DVC_VAR *);
3004static int AdvInitAsc3550Driver(ADV_DVC_VAR *); 3000static int AdvInitAsc3550Driver(ADV_DVC_VAR *);
3005static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *); 3001static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *);
3006static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *); 3002static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *);
@@ -3597,6 +3593,7 @@ typedef struct adv_req {
3597 * field. It is guaranteed to be allocated from DMA-able memory. 3593 * field. It is guaranteed to be allocated from DMA-able memory.
3598 */ 3594 */
3599typedef struct asc_board { 3595typedef struct asc_board {
3596 struct device *dev;
3600 int id; /* Board Id */ 3597 int id; /* Board Id */
3601 uint flags; /* Board flags */ 3598 uint flags; /* Board flags */
3602 union { 3599 union {
@@ -4672,7 +4669,6 @@ static void asc_scsi_done_list(struct scsi_cmnd *scp)
4672 ASC_DBG(2, "asc_scsi_done_list: begin\n"); 4669 ASC_DBG(2, "asc_scsi_done_list: begin\n");
4673 while (scp != NULL) { 4670 while (scp != NULL) {
4674 asc_board_t *boardp; 4671 asc_board_t *boardp;
4675 struct device *dev;
4676 4672
4677 ASC_DBG1(3, "asc_scsi_done_list: scp 0x%lx\n", (ulong)scp); 4673 ASC_DBG1(3, "asc_scsi_done_list: scp 0x%lx\n", (ulong)scp);
4678 tscp = REQPNEXT(scp); 4674 tscp = REQPNEXT(scp);
@@ -4680,17 +4676,12 @@ static void asc_scsi_done_list(struct scsi_cmnd *scp)
4680 4676
4681 boardp = ASC_BOARDP(scp->device->host); 4677 boardp = ASC_BOARDP(scp->device->host);
4682 4678
4683 if (ASC_NARROW_BOARD(boardp))
4684 dev = boardp->dvc_cfg.asc_dvc_cfg.dev;
4685 else
4686 dev = boardp->dvc_cfg.adv_dvc_cfg.dev;
4687
4688 if (scp->use_sg) 4679 if (scp->use_sg)
4689 dma_unmap_sg(dev, 4680 dma_unmap_sg(boardp->dev,
4690 (struct scatterlist *)scp->request_buffer, 4681 (struct scatterlist *)scp->request_buffer,
4691 scp->use_sg, scp->sc_data_direction); 4682 scp->use_sg, scp->sc_data_direction);
4692 else if (scp->request_bufflen) 4683 else if (scp->request_bufflen)
4693 dma_unmap_single(dev, scp->SCp.dma_handle, 4684 dma_unmap_single(boardp->dev, scp->SCp.dma_handle,
4694 scp->request_bufflen, 4685 scp->request_bufflen,
4695 scp->sc_data_direction); 4686 scp->sc_data_direction);
4696 4687
@@ -4929,8 +4920,6 @@ static int asc_execute_scsi_cmnd(struct scsi_cmnd *scp)
4929 */ 4920 */
4930static int asc_build_req(asc_board_t *boardp, struct scsi_cmnd *scp) 4921static int asc_build_req(asc_board_t *boardp, struct scsi_cmnd *scp)
4931{ 4922{
4932 struct device *dev = boardp->dvc_cfg.asc_dvc_cfg.dev;
4933
4934 /* 4923 /*
4935 * Mutually exclusive access is required to 'asc_scsi_q' and 4924 * Mutually exclusive access is required to 'asc_scsi_q' and
4936 * 'asc_sg_head' until after the request is started. 4925 * '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 */ 4983 */
4995 ASC_STATS(scp->device->host, cont_cnt); 4984 ASC_STATS(scp->device->host, cont_cnt);
4996 scp->SCp.dma_handle = scp->request_bufflen ? 4985 scp->SCp.dma_handle = scp->request_bufflen ?
4997 dma_map_single(dev, scp->request_buffer, 4986 dma_map_single(boardp->dev, scp->request_buffer,
4998 scp->request_bufflen, 4987 scp->request_bufflen,
4999 scp->sc_data_direction) : 0; 4988 scp->sc_data_direction) : 0;
5000 asc_scsi_q.q1.data_addr = cpu_to_le32(scp->SCp.dma_handle); 4989 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 struct scatterlist *slp; 5001 struct scatterlist *slp;
5013 5002
5014 slp = (struct scatterlist *)scp->request_buffer; 5003 slp = (struct scatterlist *)scp->request_buffer;
5015 use_sg = 5004 use_sg = dma_map_sg(boardp->dev, slp, scp->use_sg,
5016 dma_map_sg(dev, slp, scp->use_sg, scp->sc_data_direction); 5005 scp->sc_data_direction);
5017 5006
5018 if (use_sg > scp->device->host->sg_tablesize) { 5007 if (use_sg > scp->device->host->sg_tablesize) {
5019 ASC_PRINT3 5008 ASC_PRINT3("asc_build_req: board %d: use_sg %d > "
5020 ("asc_build_req: board %d: use_sg %d > sg_tablesize %d\n", 5009 "sg_tablesize %d\n", boardp->id, use_sg,
5021 boardp->id, use_sg, 5010 scp->device->host->sg_tablesize);
5022 scp->device->host->sg_tablesize); 5011 dma_unmap_sg(boardp->dev, slp, scp->use_sg,
5023 dma_unmap_sg(dev, slp, scp->use_sg,
5024 scp->sc_data_direction); 5012 scp->sc_data_direction);
5025 scp->result = HOST_BYTE(DID_ERROR); 5013 scp->result = HOST_BYTE(DID_ERROR);
5026 asc_enqueue(&boardp->done, scp, ASC_BACK); 5014 asc_enqueue(&boardp->done, scp, ASC_BACK);
@@ -5081,7 +5069,6 @@ adv_build_req(asc_board_t *boardp, struct scsi_cmnd *scp,
5081 ADV_SCSI_REQ_Q *scsiqp; 5069 ADV_SCSI_REQ_Q *scsiqp;
5082 int i; 5070 int i;
5083 int ret; 5071 int ret;
5084 struct device *dev = boardp->dvc_cfg.adv_dvc_cfg.dev;
5085 5072
5086 /* 5073 /*
5087 * Allocate an adv_req_t structure from the board to execute 5074 * 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 if (scp->request_bufflen) { 5155 if (scp->request_bufflen) {
5169 scsiqp->vdata_addr = scp->request_buffer; 5156 scsiqp->vdata_addr = scp->request_buffer;
5170 scp->SCp.dma_handle = 5157 scp->SCp.dma_handle =
5171 dma_map_single(dev, scp->request_buffer, 5158 dma_map_single(boardp->dev, scp->request_buffer,
5172 scp->request_bufflen, 5159 scp->request_bufflen,
5173 scp->sc_data_direction); 5160 scp->sc_data_direction);
5174 } else { 5161 } else {
@@ -5189,22 +5176,21 @@ adv_build_req(asc_board_t *boardp, struct scsi_cmnd *scp,
5189 int use_sg; 5176 int use_sg;
5190 5177
5191 slp = (struct scatterlist *)scp->request_buffer; 5178 slp = (struct scatterlist *)scp->request_buffer;
5192 use_sg = 5179 use_sg = dma_map_sg(boardp->dev, slp, scp->use_sg,
5193 dma_map_sg(dev, slp, scp->use_sg, scp->sc_data_direction); 5180 scp->sc_data_direction);
5194 5181
5195 if (use_sg > ADV_MAX_SG_LIST) { 5182 if (use_sg > ADV_MAX_SG_LIST) {
5196 ASC_PRINT3 5183 ASC_PRINT3("adv_build_req: board %d: use_sg %d > "
5197 ("adv_build_req: board %d: use_sg %d > ADV_MAX_SG_LIST %d\n", 5184 "ADV_MAX_SG_LIST %d\n", boardp->id, use_sg,
5198 boardp->id, use_sg, 5185 scp->device->host->sg_tablesize);
5199 scp->device->host->sg_tablesize); 5186 dma_unmap_sg(boardp->dev, slp, scp->use_sg,
5200 dma_unmap_sg(dev, slp, scp->use_sg,
5201 scp->sc_data_direction); 5187 scp->sc_data_direction);
5202 scp->result = HOST_BYTE(DID_ERROR); 5188 scp->result = HOST_BYTE(DID_ERROR);
5203 asc_enqueue(&boardp->done, scp, ASC_BACK); 5189 asc_enqueue(&boardp->done, scp, ASC_BACK);
5204 5190
5205 /* 5191 /*
5206 * Free the 'adv_req_t' structure by adding it back to the 5192 * Free the 'adv_req_t' structure by adding it back
5207 * board free list. 5193 * to the board free list.
5208 */ 5194 */
5209 reqp->next_reqp = boardp->adv_reqp; 5195 reqp->next_reqp = boardp->adv_reqp;
5210 boardp->adv_reqp = reqp; 5196 boardp->adv_reqp = reqp;
@@ -5212,12 +5198,11 @@ adv_build_req(asc_board_t *boardp, struct scsi_cmnd *scp,
5212 return ASC_ERROR; 5198 return ASC_ERROR;
5213 } 5199 }
5214 5200
5215 if ((ret = 5201 ret = adv_get_sglist(boardp, reqp, scp, use_sg);
5216 adv_get_sglist(boardp, reqp, scp, 5202 if (ret != ADV_SUCCESS) {
5217 use_sg)) != ADV_SUCCESS) {
5218 /* 5203 /*
5219 * Free the adv_req_t structure by adding it back to the 5204 * Free the adv_req_t structure by adding it back to
5220 * board free list. 5205 * the board free list.
5221 */ 5206 */
5222 reqp->next_reqp = boardp->adv_reqp; 5207 reqp->next_reqp = boardp->adv_reqp;
5223 boardp->adv_reqp = reqp; 5208 boardp->adv_reqp = reqp;
@@ -10219,30 +10204,21 @@ static ushort __devinit AscInitGetConfig(ASC_DVC_VAR *asc_dvc)
10219 return warn_code; 10204 return warn_code;
10220} 10205}
10221 10206
10222static ushort __devinit AscInitSetConfig(ASC_DVC_VAR *asc_dvc) 10207static unsigned short __devinit
10208AscInitSetConfig(struct pci_dev *pdev, ASC_DVC_VAR *asc_dvc)
10223{ 10209{
10224 ushort warn_code = 0; 10210 PortAddr iop_base = asc_dvc->iop_base;
10211 unsigned short cfg_msw;
10212 unsigned short warn_code = 0;
10225 10213
10226 asc_dvc->init_state |= ASC_INIT_STATE_BEG_SET_CFG; 10214 asc_dvc->init_state |= ASC_INIT_STATE_BEG_SET_CFG;
10227 if (asc_dvc->err_code != 0) 10215 if (asc_dvc->err_code != 0)
10228 return (UW_ERR); 10216 return UW_ERR;
10229 if (AscFindSignature(asc_dvc->iop_base)) { 10217 if (!AscFindSignature(asc_dvc->iop_base)) {
10230 warn_code |= AscInitFromAscDvcVar(asc_dvc);
10231 asc_dvc->init_state |= ASC_INIT_STATE_END_SET_CFG;
10232 } else {
10233 asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE; 10218 asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
10219 return 0;
10234 } 10220 }
10235 return (warn_code);
10236}
10237
10238static ushort __devinit AscInitFromAscDvcVar(ASC_DVC_VAR *asc_dvc)
10239{
10240 PortAddr iop_base;
10241 ushort cfg_msw;
10242 ushort warn_code;
10243 10221
10244 iop_base = asc_dvc->iop_base;
10245 warn_code = 0;
10246 cfg_msw = AscGetChipCfgMsw(iop_base); 10222 cfg_msw = AscGetChipCfgMsw(iop_base);
10247 if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) { 10223 if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) {
10248 cfg_msw &= (~(ASC_CFG_MSW_CLR_MASK)); 10224 cfg_msw &= (~(ASC_CFG_MSW_CLR_MASK));
@@ -10265,7 +10241,6 @@ static ushort __devinit AscInitFromAscDvcVar(ASC_DVC_VAR *asc_dvc)
10265 } 10241 }
10266#ifdef CONFIG_PCI 10242#ifdef CONFIG_PCI
10267 if (asc_dvc->bus_type & ASC_IS_PCI) { 10243 if (asc_dvc->bus_type & ASC_IS_PCI) {
10268 struct pci_dev *pdev = to_pci_dev(asc_dvc->cfg->dev);
10269 cfg_msw &= 0xFFC0; 10244 cfg_msw &= 0xFFC0;
10270 AscSetChipCfgMsw(iop_base, cfg_msw); 10245 AscSetChipCfgMsw(iop_base, cfg_msw);
10271 if ((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) == ASC_IS_PCI_ULTRA) { 10246 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 AscSetIsaDmaSpeed(iop_base, asc_dvc->cfg->isa_dma_speed); 10270 AscSetIsaDmaSpeed(iop_base, asc_dvc->cfg->isa_dma_speed);
10296 } 10271 }
10297#endif /* CONFIG_ISA */ 10272#endif /* CONFIG_ISA */
10298 return (warn_code); 10273
10274 asc_dvc->init_state |= ASC_INIT_STATE_END_SET_CFG;
10275 return warn_code;
10299} 10276}
10300 10277
10301static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc) 10278static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc)
@@ -13599,11 +13576,11 @@ static ADVEEP_38C1600_CONFIG ADVEEP_38C1600_Config_Field_IsChar __devinitdata =
13599 * For a non-fatal error return a warning code. If there are no warnings 13576 * For a non-fatal error return a warning code. If there are no warnings
13600 * then 0 is returned. 13577 * then 0 is returned.
13601 */ 13578 */
13602static int __devinit AdvInitGetConfig(ADV_DVC_VAR *asc_dvc) 13579static int __devinit
13580AdvInitGetConfig(struct pci_dev *pdev, ADV_DVC_VAR *asc_dvc)
13603{ 13581{
13604 unsigned short warn_code = 0; 13582 unsigned short warn_code = 0;
13605 AdvPortAddr iop_base = asc_dvc->iop_base; 13583 AdvPortAddr iop_base = asc_dvc->iop_base;
13606 struct pci_dev *pdev = to_pci_dev(asc_dvc->cfg->dev);
13607 u16 cmd; 13584 u16 cmd;
13608 int status; 13585 int status;
13609 13586
@@ -17094,6 +17071,7 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
17094 memset(boardp, 0, sizeof(asc_board_t)); 17071 memset(boardp, 0, sizeof(asc_board_t));
17095 boardp->id = asc_board_count++; 17072 boardp->id = asc_board_count++;
17096 spin_lock_init(&boardp->lock); 17073 spin_lock_init(&boardp->lock);
17074 boardp->dev = dev;
17097 17075
17098 /* 17076 /*
17099 * Handle both narrow and wide boards. 17077 * Handle both narrow and wide boards.
@@ -17180,7 +17158,6 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
17180#endif /* CONFIG_PROC_FS */ 17158#endif /* CONFIG_PROC_FS */
17181 17159
17182 if (ASC_NARROW_BOARD(boardp)) { 17160 if (ASC_NARROW_BOARD(boardp)) {
17183 asc_dvc_varp->cfg->dev = dev;
17184 /* 17161 /*
17185 * Set the board bus type and PCI IRQ before 17162 * Set the board bus type and PCI IRQ before
17186 * calling AscInitGetConfig(). 17163 * calling AscInitGetConfig().
@@ -17220,7 +17197,6 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
17220 break; 17197 break;
17221 } 17198 }
17222 } else { 17199 } else {
17223 adv_dvc_varp->cfg->dev = dev;
17224 /* 17200 /*
17225 * For Wide boards set PCI information before calling 17201 * For Wide boards set PCI information before calling
17226 * AdvInitGetConfig(). 17202 * AdvInitGetConfig().
@@ -17289,7 +17265,9 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
17289 } 17265 }
17290 } else { 17266 } else {
17291 ASC_DBG(2, "advansys_board_found: AdvInitGetConfig()\n"); 17267 ASC_DBG(2, "advansys_board_found: AdvInitGetConfig()\n");
17292 if ((ret = AdvInitGetConfig(adv_dvc_varp)) != 0) { 17268
17269 ret = AdvInitGetConfig(pdev, adv_dvc_varp);
17270 if (ret != 0) {
17293 ASC_PRINT2 17271 ASC_PRINT2
17294 ("AdvInitGetConfig: board %d: warning: 0x%x\n", 17272 ("AdvInitGetConfig: board %d: warning: 0x%x\n",
17295 boardp->id, ret); 17273 boardp->id, ret);
@@ -17345,7 +17323,7 @@ advansys_board_found(int iop, struct device *dev, int bus_type)
17345 * Modify board configuration. 17323 * Modify board configuration.
17346 */ 17324 */
17347 ASC_DBG(2, "advansys_board_found: AscInitSetConfig()\n"); 17325 ASC_DBG(2, "advansys_board_found: AscInitSetConfig()\n");
17348 switch (ret = AscInitSetConfig(asc_dvc_varp)) { 17326 switch (ret = AscInitSetConfig(pdev, asc_dvc_varp)) {
17349 case 0: /* No error. */ 17327 case 0: /* No error. */
17350 break; 17328 break;
17351 case ASC_WARN_IO_PORT_ROTATE: 17329 case ASC_WARN_IO_PORT_ROTATE: