diff options
| -rw-r--r-- | drivers/scsi/stex.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/drivers/scsi/stex.c b/drivers/scsi/stex.c index 0fd115c04e59..bfd7983045b7 100644 --- a/drivers/scsi/stex.c +++ b/drivers/scsi/stex.c | |||
| @@ -121,7 +121,8 @@ enum { | |||
| 121 | 121 | ||
| 122 | st_shasta = 0, | 122 | st_shasta = 0, |
| 123 | st_vsc = 1, | 123 | st_vsc = 1, |
| 124 | st_yosemite = 2, | 124 | st_vsc1 = 2, |
| 125 | st_yosemite = 3, | ||
| 125 | 126 | ||
| 126 | PASSTHRU_REQ_TYPE = 0x00000001, | 127 | PASSTHRU_REQ_TYPE = 0x00000001, |
| 127 | PASSTHRU_REQ_NO_WAKEUP = 0x00000100, | 128 | PASSTHRU_REQ_NO_WAKEUP = 0x00000100, |
| @@ -151,6 +152,8 @@ enum { | |||
| 151 | MGT_CMD_SIGNATURE = 0xba, | 152 | MGT_CMD_SIGNATURE = 0xba, |
| 152 | 153 | ||
| 153 | INQUIRY_EVPD = 0x01, | 154 | INQUIRY_EVPD = 0x01, |
| 155 | |||
| 156 | ST_ADDITIONAL_MEM = 0x200000, | ||
| 154 | }; | 157 | }; |
| 155 | 158 | ||
| 156 | /* SCSI inquiry data */ | 159 | /* SCSI inquiry data */ |
| @@ -212,7 +215,9 @@ struct handshake_frame { | |||
| 212 | __le32 partner_ver_minor; | 215 | __le32 partner_ver_minor; |
| 213 | __le32 partner_ver_oem; | 216 | __le32 partner_ver_oem; |
| 214 | __le32 partner_ver_build; | 217 | __le32 partner_ver_build; |
| 215 | u32 reserved1[4]; | 218 | __le32 extra_offset; /* NEW */ |
| 219 | __le32 extra_size; /* NEW */ | ||
| 220 | u32 reserved1[2]; | ||
| 216 | }; | 221 | }; |
| 217 | 222 | ||
| 218 | struct req_msg { | 223 | struct req_msg { |
| @@ -303,6 +308,7 @@ struct st_hba { | |||
| 303 | void __iomem *mmio_base; /* iomapped PCI memory space */ | 308 | void __iomem *mmio_base; /* iomapped PCI memory space */ |
| 304 | void *dma_mem; | 309 | void *dma_mem; |
| 305 | dma_addr_t dma_handle; | 310 | dma_addr_t dma_handle; |
| 311 | size_t dma_size; | ||
| 306 | 312 | ||
| 307 | struct Scsi_Host *host; | 313 | struct Scsi_Host *host; |
| 308 | struct pci_dev *pdev; | 314 | struct pci_dev *pdev; |
| @@ -941,6 +947,11 @@ static int stex_handshake(struct st_hba *hba) | |||
| 941 | h->status_cnt = cpu_to_le16(MU_STATUS_COUNT); | 947 | h->status_cnt = cpu_to_le16(MU_STATUS_COUNT); |
| 942 | stex_gettime(&h->hosttime); | 948 | stex_gettime(&h->hosttime); |
| 943 | h->partner_type = HMU_PARTNER_TYPE; | 949 | h->partner_type = HMU_PARTNER_TYPE; |
| 950 | if (hba->dma_size > STEX_BUFFER_SIZE) { | ||
| 951 | h->extra_offset = cpu_to_le32(STEX_BUFFER_SIZE); | ||
| 952 | h->extra_size = cpu_to_le32(ST_ADDITIONAL_MEM); | ||
| 953 | } else | ||
| 954 | h->extra_offset = h->extra_size = 0; | ||
| 944 | 955 | ||
| 945 | status_phys = hba->dma_handle + MU_REQ_BUFFER_SIZE; | 956 | status_phys = hba->dma_handle + MU_REQ_BUFFER_SIZE; |
| 946 | writel(status_phys, base + IMR0); | 957 | writel(status_phys, base + IMR0); |
| @@ -1203,8 +1214,13 @@ stex_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1203 | goto out_iounmap; | 1214 | goto out_iounmap; |
| 1204 | } | 1215 | } |
| 1205 | 1216 | ||
| 1217 | hba->cardtype = (unsigned int) id->driver_data; | ||
| 1218 | if (hba->cardtype == st_vsc && (pdev->subsystem_device & 0xf) == 0x1) | ||
| 1219 | hba->cardtype = st_vsc1; | ||
| 1220 | hba->dma_size = (hba->cardtype == st_vsc1) ? | ||
| 1221 | (STEX_BUFFER_SIZE + ST_ADDITIONAL_MEM) : (STEX_BUFFER_SIZE); | ||
| 1206 | hba->dma_mem = dma_alloc_coherent(&pdev->dev, | 1222 | hba->dma_mem = dma_alloc_coherent(&pdev->dev, |
| 1207 | STEX_BUFFER_SIZE, &hba->dma_handle, GFP_KERNEL); | 1223 | hba->dma_size, &hba->dma_handle, GFP_KERNEL); |
| 1208 | if (!hba->dma_mem) { | 1224 | if (!hba->dma_mem) { |
| 1209 | err = -ENOMEM; | 1225 | err = -ENOMEM; |
| 1210 | printk(KERN_ERR DRV_NAME "(%s): dma mem alloc failed\n", | 1226 | printk(KERN_ERR DRV_NAME "(%s): dma mem alloc failed\n", |
| @@ -1217,8 +1233,6 @@ stex_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1217 | hba->copy_buffer = hba->dma_mem + MU_BUFFER_SIZE; | 1233 | hba->copy_buffer = hba->dma_mem + MU_BUFFER_SIZE; |
| 1218 | hba->mu_status = MU_STATE_STARTING; | 1234 | hba->mu_status = MU_STATE_STARTING; |
| 1219 | 1235 | ||
| 1220 | hba->cardtype = (unsigned int) id->driver_data; | ||
| 1221 | |||
| 1222 | /* firmware uses id/lun pair for a logical drive, but lun would be | 1236 | /* firmware uses id/lun pair for a logical drive, but lun would be |
| 1223 | always 0 if CONFIG_SCSI_MULTI_LUN not configured, so we use | 1237 | always 0 if CONFIG_SCSI_MULTI_LUN not configured, so we use |
| 1224 | channel to map lun here */ | 1238 | channel to map lun here */ |
| @@ -1266,7 +1280,7 @@ stex_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1266 | out_free_irq: | 1280 | out_free_irq: |
| 1267 | free_irq(pdev->irq, hba); | 1281 | free_irq(pdev->irq, hba); |
| 1268 | out_pci_free: | 1282 | out_pci_free: |
| 1269 | dma_free_coherent(&pdev->dev, STEX_BUFFER_SIZE, | 1283 | dma_free_coherent(&pdev->dev, hba->dma_size, |
| 1270 | hba->dma_mem, hba->dma_handle); | 1284 | hba->dma_mem, hba->dma_handle); |
| 1271 | out_iounmap: | 1285 | out_iounmap: |
| 1272 | iounmap(hba->mmio_base); | 1286 | iounmap(hba->mmio_base); |
| @@ -1327,7 +1341,7 @@ static void stex_hba_free(struct st_hba *hba) | |||
| 1327 | 1341 | ||
| 1328 | pci_release_regions(hba->pdev); | 1342 | pci_release_regions(hba->pdev); |
| 1329 | 1343 | ||
| 1330 | dma_free_coherent(&hba->pdev->dev, STEX_BUFFER_SIZE, | 1344 | dma_free_coherent(&hba->pdev->dev, hba->dma_size, |
| 1331 | hba->dma_mem, hba->dma_handle); | 1345 | hba->dma_mem, hba->dma_handle); |
| 1332 | } | 1346 | } |
| 1333 | 1347 | ||
