diff options
author | James Smart <James.Smart@Emulex.Com> | 2009-05-22 14:51:39 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2009-06-08 12:21:29 -0400 |
commit | da0436e915a5c17ee79e72c1bf978a4ebb1cbf4d (patch) | |
tree | 7784646b7627117fa7849a901c85294fae905505 /drivers/scsi/lpfc/lpfc_vport.c | |
parent | 3772a99175f5378b5001e8da364341a8b8226a4a (diff) |
[SCSI] lpfc 8.3.2 : Addition of SLI4 Interface - Base Support
Adds new hardware and interface definitions.
Adds new interface routines - utilizing the reorganized layout of the
driver. Adds SLI-4 specific functions for attachment, initialization,
teardown, etc.
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_vport.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_vport.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/scsi/lpfc/lpfc_vport.c b/drivers/scsi/lpfc/lpfc_vport.c index 917ad56b0aff..59e67f7ee531 100644 --- a/drivers/scsi/lpfc/lpfc_vport.c +++ b/drivers/scsi/lpfc/lpfc_vport.c | |||
@@ -32,8 +32,10 @@ | |||
32 | #include <scsi/scsi_device.h> | 32 | #include <scsi/scsi_device.h> |
33 | #include <scsi/scsi_host.h> | 33 | #include <scsi/scsi_host.h> |
34 | #include <scsi/scsi_transport_fc.h> | 34 | #include <scsi/scsi_transport_fc.h> |
35 | #include "lpfc_hw4.h" | ||
35 | #include "lpfc_hw.h" | 36 | #include "lpfc_hw.h" |
36 | #include "lpfc_sli.h" | 37 | #include "lpfc_sli.h" |
38 | #include "lpfc_sli4.h" | ||
37 | #include "lpfc_nl.h" | 39 | #include "lpfc_nl.h" |
38 | #include "lpfc_disc.h" | 40 | #include "lpfc_disc.h" |
39 | #include "lpfc_scsi.h" | 41 | #include "lpfc_scsi.h" |
@@ -89,6 +91,8 @@ lpfc_alloc_vpi(struct lpfc_hba *phba) | |||
89 | vpi = 0; | 91 | vpi = 0; |
90 | else | 92 | else |
91 | set_bit(vpi, phba->vpi_bmask); | 93 | set_bit(vpi, phba->vpi_bmask); |
94 | if (phba->sli_rev == LPFC_SLI_REV4) | ||
95 | phba->sli4_hba.max_cfg_param.vpi_used++; | ||
92 | spin_unlock_irq(&phba->hbalock); | 96 | spin_unlock_irq(&phba->hbalock); |
93 | return vpi; | 97 | return vpi; |
94 | } | 98 | } |
@@ -96,8 +100,12 @@ lpfc_alloc_vpi(struct lpfc_hba *phba) | |||
96 | static void | 100 | static void |
97 | lpfc_free_vpi(struct lpfc_hba *phba, int vpi) | 101 | lpfc_free_vpi(struct lpfc_hba *phba, int vpi) |
98 | { | 102 | { |
103 | if (vpi == 0) | ||
104 | return; | ||
99 | spin_lock_irq(&phba->hbalock); | 105 | spin_lock_irq(&phba->hbalock); |
100 | clear_bit(vpi, phba->vpi_bmask); | 106 | clear_bit(vpi, phba->vpi_bmask); |
107 | if (phba->sli_rev == LPFC_SLI_REV4) | ||
108 | phba->sli4_hba.max_cfg_param.vpi_used--; | ||
101 | spin_unlock_irq(&phba->hbalock); | 109 | spin_unlock_irq(&phba->hbalock); |
102 | } | 110 | } |
103 | 111 | ||
@@ -308,6 +316,21 @@ lpfc_vport_create(struct fc_vport *fc_vport, bool disable) | |||
308 | goto error_out; | 316 | goto error_out; |
309 | } | 317 | } |
310 | 318 | ||
319 | /* | ||
320 | * In SLI4, the vpi must be activated before it can be used | ||
321 | * by the port. | ||
322 | */ | ||
323 | if (phba->sli_rev == LPFC_SLI_REV4) { | ||
324 | rc = lpfc_sli4_init_vpi(phba, vpi); | ||
325 | if (rc) { | ||
326 | lpfc_printf_log(phba, KERN_ERR, LOG_VPORT, | ||
327 | "1838 Failed to INIT_VPI on vpi %d " | ||
328 | "status %d\n", vpi, rc); | ||
329 | rc = VPORT_NORESOURCES; | ||
330 | lpfc_free_vpi(phba, vpi); | ||
331 | goto error_out; | ||
332 | } | ||
333 | } | ||
311 | 334 | ||
312 | /* Assign an unused board number */ | 335 | /* Assign an unused board number */ |
313 | if ((instance = lpfc_get_instance()) < 0) { | 336 | if ((instance = lpfc_get_instance()) < 0) { |