diff options
author | Jayamohan Kallickal <jayamohank@serverengines.com> | 2010-02-10 18:41:15 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2010-02-17 14:41:10 -0500 |
commit | f98c96b0b6572b5491e954148509b20f08f31491 (patch) | |
tree | 61754d9bc42c06511c55ca2d4bdc58f7eec386ed /drivers/scsi | |
parent | b3925514f6f6878e3f671fb6990874e731a26d02 (diff) |
[SCSI] be2iscsi: Adding support for BE3
This patch contains changes to support the BE3 chip
Signed-off-by: Jayamohan Kallickal <jayamohank@serverengines.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/be2iscsi/be.h | 3 | ||||
-rw-r--r-- | drivers/scsi/be2iscsi/be_main.c | 30 | ||||
-rw-r--r-- | drivers/scsi/be2iscsi/be_main.h | 6 | ||||
-rw-r--r-- | drivers/scsi/be2iscsi/be_mgmt.c | 2 |
4 files changed, 35 insertions, 6 deletions
diff --git a/drivers/scsi/be2iscsi/be.h b/drivers/scsi/be2iscsi/be.h index 0063740bbccf..136b49cea791 100644 --- a/drivers/scsi/be2iscsi/be.h +++ b/drivers/scsi/be2iscsi/be.h | |||
@@ -25,6 +25,9 @@ | |||
25 | #define MCC_Q_LEN 128 | 25 | #define MCC_Q_LEN 128 |
26 | #define MCC_CQ_LEN 256 | 26 | #define MCC_CQ_LEN 256 |
27 | #define MAX_MCC_CMD 16 | 27 | #define MAX_MCC_CMD 16 |
28 | /* BladeEngine Generation numbers */ | ||
29 | #define BE_GEN2 2 | ||
30 | #define BE_GEN3 3 | ||
28 | 31 | ||
29 | struct be_dma_mem { | 32 | struct be_dma_mem { |
30 | void *va; | 33 | void *va; |
diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c index 687d535894a9..7c22616ab141 100644 --- a/drivers/scsi/be2iscsi/be_main.c +++ b/drivers/scsi/be2iscsi/be_main.c | |||
@@ -61,10 +61,10 @@ static int beiscsi_slave_configure(struct scsi_device *sdev) | |||
61 | /*------------------- PCI Driver operations and data ----------------- */ | 61 | /*------------------- PCI Driver operations and data ----------------- */ |
62 | static DEFINE_PCI_DEVICE_TABLE(beiscsi_pci_id_table) = { | 62 | static DEFINE_PCI_DEVICE_TABLE(beiscsi_pci_id_table) = { |
63 | { PCI_DEVICE(BE_VENDOR_ID, BE_DEVICE_ID1) }, | 63 | { PCI_DEVICE(BE_VENDOR_ID, BE_DEVICE_ID1) }, |
64 | { PCI_DEVICE(BE_VENDOR_ID, BE_DEVICE_ID2) }, | ||
64 | { PCI_DEVICE(BE_VENDOR_ID, OC_DEVICE_ID1) }, | 65 | { PCI_DEVICE(BE_VENDOR_ID, OC_DEVICE_ID1) }, |
65 | { PCI_DEVICE(BE_VENDOR_ID, OC_DEVICE_ID2) }, | 66 | { PCI_DEVICE(BE_VENDOR_ID, OC_DEVICE_ID2) }, |
66 | { PCI_DEVICE(BE_VENDOR_ID, OC_DEVICE_ID3) }, | 67 | { PCI_DEVICE(BE_VENDOR_ID, OC_DEVICE_ID3) }, |
67 | { PCI_DEVICE(BE_VENDOR_ID, OC_DEVICE_ID4) }, | ||
68 | { 0 } | 68 | { 0 } |
69 | }; | 69 | }; |
70 | MODULE_DEVICE_TABLE(pci, beiscsi_pci_id_table); | 70 | MODULE_DEVICE_TABLE(pci, beiscsi_pci_id_table); |
@@ -143,6 +143,7 @@ static int beiscsi_map_pci_bars(struct beiscsi_hba *phba, | |||
143 | struct pci_dev *pcidev) | 143 | struct pci_dev *pcidev) |
144 | { | 144 | { |
145 | u8 __iomem *addr; | 145 | u8 __iomem *addr; |
146 | int pcicfg_reg; | ||
146 | 147 | ||
147 | addr = ioremap_nocache(pci_resource_start(pcidev, 2), | 148 | addr = ioremap_nocache(pci_resource_start(pcidev, 2), |
148 | pci_resource_len(pcidev, 2)); | 149 | pci_resource_len(pcidev, 2)); |
@@ -159,13 +160,19 @@ static int beiscsi_map_pci_bars(struct beiscsi_hba *phba, | |||
159 | phba->db_va = addr; | 160 | phba->db_va = addr; |
160 | phba->db_pa.u.a64.address = pci_resource_start(pcidev, 4); | 161 | phba->db_pa.u.a64.address = pci_resource_start(pcidev, 4); |
161 | 162 | ||
162 | addr = ioremap_nocache(pci_resource_start(pcidev, 1), | 163 | if (phba->generation == BE_GEN2) |
163 | pci_resource_len(pcidev, 1)); | 164 | pcicfg_reg = 1; |
165 | else | ||
166 | pcicfg_reg = 0; | ||
167 | |||
168 | addr = ioremap_nocache(pci_resource_start(pcidev, pcicfg_reg), | ||
169 | pci_resource_len(pcidev, pcicfg_reg)); | ||
170 | |||
164 | if (addr == NULL) | 171 | if (addr == NULL) |
165 | goto pci_map_err; | 172 | goto pci_map_err; |
166 | phba->ctrl.pcicfg = addr; | 173 | phba->ctrl.pcicfg = addr; |
167 | phba->pci_va = addr; | 174 | phba->pci_va = addr; |
168 | phba->pci_pa.u.a64.address = pci_resource_start(pcidev, 1); | 175 | phba->pci_pa.u.a64.address = pci_resource_start(pcidev, pcicfg_reg); |
169 | return 0; | 176 | return 0; |
170 | 177 | ||
171 | pci_map_err: | 178 | pci_map_err: |
@@ -3492,7 +3499,6 @@ static int beiscsi_mtask(struct iscsi_task *task) | |||
3492 | io_task->pwrb_handle->wrb_index); | 3499 | io_task->pwrb_handle->wrb_index); |
3493 | AMAP_SET_BITS(struct amap_iscsi_wrb, sgl_icd_idx, pwrb, | 3500 | AMAP_SET_BITS(struct amap_iscsi_wrb, sgl_icd_idx, pwrb, |
3494 | io_task->psgl_handle->sgl_index); | 3501 | io_task->psgl_handle->sgl_index); |
3495 | |||
3496 | switch (task->hdr->opcode & ISCSI_OPCODE_MASK) { | 3502 | switch (task->hdr->opcode & ISCSI_OPCODE_MASK) { |
3497 | case ISCSI_OP_LOGIN: | 3503 | case ISCSI_OP_LOGIN: |
3498 | AMAP_SET_BITS(struct amap_iscsi_wrb, type, pwrb, | 3504 | AMAP_SET_BITS(struct amap_iscsi_wrb, type, pwrb, |
@@ -3695,6 +3701,20 @@ static int __devinit beiscsi_dev_probe(struct pci_dev *pcidev, | |||
3695 | } | 3701 | } |
3696 | SE_DEBUG(DBG_LVL_8, " phba = %p \n", phba); | 3702 | SE_DEBUG(DBG_LVL_8, " phba = %p \n", phba); |
3697 | 3703 | ||
3704 | switch (pcidev->device) { | ||
3705 | case BE_DEVICE_ID1: | ||
3706 | case OC_DEVICE_ID1: | ||
3707 | case OC_DEVICE_ID2: | ||
3708 | phba->generation = BE_GEN2; | ||
3709 | break; | ||
3710 | case BE_DEVICE_ID2: | ||
3711 | case OC_DEVICE_ID3: | ||
3712 | phba->generation = BE_GEN3; | ||
3713 | break; | ||
3714 | default: | ||
3715 | phba->generation = 0; | ||
3716 | } | ||
3717 | |||
3698 | if (enable_msix) | 3718 | if (enable_msix) |
3699 | num_cpus = find_num_cpus(); | 3719 | num_cpus = find_num_cpus(); |
3700 | else | 3720 | else |
diff --git a/drivers/scsi/be2iscsi/be_main.h b/drivers/scsi/be2iscsi/be_main.h index 8cbe9084bd3e..c53a80ab796c 100644 --- a/drivers/scsi/be2iscsi/be_main.h +++ b/drivers/scsi/be2iscsi/be_main.h | |||
@@ -40,11 +40,14 @@ | |||
40 | #define DRV_DESC BE_NAME " " "Driver" | 40 | #define DRV_DESC BE_NAME " " "Driver" |
41 | 41 | ||
42 | #define BE_VENDOR_ID 0x19A2 | 42 | #define BE_VENDOR_ID 0x19A2 |
43 | /* DEVICE ID's for BE2 */ | ||
43 | #define BE_DEVICE_ID1 0x212 | 44 | #define BE_DEVICE_ID1 0x212 |
44 | #define OC_DEVICE_ID1 0x702 | 45 | #define OC_DEVICE_ID1 0x702 |
45 | #define OC_DEVICE_ID2 0x703 | 46 | #define OC_DEVICE_ID2 0x703 |
47 | |||
48 | /* DEVICE ID's for BE3 */ | ||
49 | #define BE_DEVICE_ID2 0x222 | ||
46 | #define OC_DEVICE_ID3 0x712 | 50 | #define OC_DEVICE_ID3 0x712 |
47 | #define OC_DEVICE_ID4 0x222 | ||
48 | 51 | ||
49 | #define BE2_IO_DEPTH 1024 | 52 | #define BE2_IO_DEPTH 1024 |
50 | #define BE2_MAX_SESSIONS 256 | 53 | #define BE2_MAX_SESSIONS 256 |
@@ -325,6 +328,7 @@ struct beiscsi_hba { | |||
325 | struct workqueue_struct *wq; /* The actuak work queue */ | 328 | struct workqueue_struct *wq; /* The actuak work queue */ |
326 | struct work_struct work_cqs; /* The work being queued */ | 329 | struct work_struct work_cqs; /* The work being queued */ |
327 | struct be_ctrl_info ctrl; | 330 | struct be_ctrl_info ctrl; |
331 | unsigned int generation; | ||
328 | }; | 332 | }; |
329 | 333 | ||
330 | struct beiscsi_session { | 334 | struct beiscsi_session { |
diff --git a/drivers/scsi/be2iscsi/be_mgmt.c b/drivers/scsi/be2iscsi/be_mgmt.c index 39106da6f547..317bcd042ced 100644 --- a/drivers/scsi/be2iscsi/be_mgmt.c +++ b/drivers/scsi/be2iscsi/be_mgmt.c | |||
@@ -85,6 +85,7 @@ unsigned char mgmt_check_supported_fw(struct be_ctrl_info *ctrl, | |||
85 | } | 85 | } |
86 | nonemb_cmd.size = sizeof(struct be_mgmt_controller_attributes); | 86 | nonemb_cmd.size = sizeof(struct be_mgmt_controller_attributes); |
87 | req = nonemb_cmd.va; | 87 | req = nonemb_cmd.va; |
88 | memset(req, 0, sizeof(*req)); | ||
88 | spin_lock(&ctrl->mbox_lock); | 89 | spin_lock(&ctrl->mbox_lock); |
89 | memset(wrb, 0, sizeof(*wrb)); | 90 | memset(wrb, 0, sizeof(*wrb)); |
90 | be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1); | 91 | be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1); |
@@ -171,6 +172,7 @@ unsigned char mgmt_invalidate_icds(struct beiscsi_hba *phba, | |||
171 | } | 172 | } |
172 | nonemb_cmd.size = sizeof(struct invalidate_commands_params_in); | 173 | nonemb_cmd.size = sizeof(struct invalidate_commands_params_in); |
173 | req = nonemb_cmd.va; | 174 | req = nonemb_cmd.va; |
175 | memset(req, 0, sizeof(*req)); | ||
174 | wrb = wrb_from_mccq(phba); | 176 | wrb = wrb_from_mccq(phba); |
175 | sge = nonembedded_sgl(wrb); | 177 | sge = nonembedded_sgl(wrb); |
176 | wrb->tag0 |= tag; | 178 | wrb->tag0 |= tag; |