aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/bfa
diff options
context:
space:
mode:
authorVijaya Mohan Guvva <vmohan@brocade.com>2013-05-13 05:33:28 -0400
committerJames Bottomley <JBottomley@Parallels.com>2013-06-26 17:44:35 -0400
commit079bcbc35ca9241abf212a795a000b2d6c2038cd (patch)
tree5e7ac11cd736732e407bc45e9088721b09aa6598 /drivers/scsi/bfa
parentbccd2683df56ddce98964f93f6984df743004240 (diff)
[SCSI] bfa: fru vpd date update changes
1. While FRU VPD data update, inform firmware to send a completion event on I2C bus. Without this change, firmware used to send completion message on I2C bus for every chunk of FRU VPD update. 2. Support for FRU VPN update on CHINOOK2 cards. 3. Append port count to the model name to differentiate between single port and dual port model of 1860. 4. Update the size of the model name to 16bytes Signed-off-by: Vijaya Mohan Guvva <vmohan@brocade.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/bfa')
-rw-r--r--drivers/scsi/bfa/bfa_defs.h9
-rw-r--r--drivers/scsi/bfa/bfa_fcs.h8
-rw-r--r--drivers/scsi/bfa/bfa_ioc.c29
-rw-r--r--drivers/scsi/bfa/bfa_ioc.h3
-rw-r--r--drivers/scsi/bfa/bfad_bsg.c2
-rw-r--r--drivers/scsi/bfa/bfad_bsg.h4
-rw-r--r--drivers/scsi/bfa/bfi.h6
7 files changed, 43 insertions, 18 deletions
diff --git a/drivers/scsi/bfa/bfa_defs.h b/drivers/scsi/bfa/bfa_defs.h
index d65a9b4a6f65..bef16d276668 100644
--- a/drivers/scsi/bfa/bfa_defs.h
+++ b/drivers/scsi/bfa/bfa_defs.h
@@ -45,6 +45,7 @@ enum {
45 BFA_MFG_TYPE_PROWLER_C = 1710, /* Prowler CNA only cards */ 45 BFA_MFG_TYPE_PROWLER_C = 1710, /* Prowler CNA only cards */
46 BFA_MFG_TYPE_PROWLER_D = 1860, /* Prowler Dual cards */ 46 BFA_MFG_TYPE_PROWLER_D = 1860, /* Prowler Dual cards */
47 BFA_MFG_TYPE_CHINOOK = 1867, /* Chinook cards */ 47 BFA_MFG_TYPE_CHINOOK = 1867, /* Chinook cards */
48 BFA_MFG_TYPE_CHINOOK2 = 1869, /*!< Chinook2 cards */
48 BFA_MFG_TYPE_INVALID = 0, /* Invalid card type */ 49 BFA_MFG_TYPE_INVALID = 0, /* Invalid card type */
49}; 50};
50 51
@@ -59,7 +60,8 @@ enum {
59 (type) == BFA_MFG_TYPE_ASTRA || \ 60 (type) == BFA_MFG_TYPE_ASTRA || \
60 (type) == BFA_MFG_TYPE_LIGHTNING_P0 || \ 61 (type) == BFA_MFG_TYPE_LIGHTNING_P0 || \
61 (type) == BFA_MFG_TYPE_LIGHTNING || \ 62 (type) == BFA_MFG_TYPE_LIGHTNING || \
62 (type) == BFA_MFG_TYPE_CHINOOK)) 63 (type) == BFA_MFG_TYPE_CHINOOK || \
64 (type) == BFA_MFG_TYPE_CHINOOK2))
63 65
64/* 66/*
65 * Check if the card having old wwn/mac handling 67 * Check if the card having old wwn/mac handling
@@ -263,6 +265,7 @@ enum {
263 BFA_ADAPTER_MFG_NAME_LEN = 8, /* manufacturer name length */ 265 BFA_ADAPTER_MFG_NAME_LEN = 8, /* manufacturer name length */
264 BFA_ADAPTER_SYM_NAME_LEN = 64, /* adapter symbolic name length */ 266 BFA_ADAPTER_SYM_NAME_LEN = 64, /* adapter symbolic name length */
265 BFA_ADAPTER_OS_TYPE_LEN = 64, /* adapter os type length */ 267 BFA_ADAPTER_OS_TYPE_LEN = 64, /* adapter os type length */
268 BFA_ADAPTER_UUID_LEN = 16, /* adapter uuid length */
266}; 269};
267 270
268struct bfa_adapter_attr_s { 271struct bfa_adapter_attr_s {
@@ -296,6 +299,7 @@ struct bfa_adapter_attr_s {
296 u8 mfg_month; /* manufacturing month */ 299 u8 mfg_month; /* manufacturing month */
297 u16 mfg_year; /* manufacturing year */ 300 u16 mfg_year; /* manufacturing year */
298 u16 rsvd; 301 u16 rsvd;
302 u8 uuid[BFA_ADAPTER_UUID_LEN];
299}; 303};
300 304
301/* 305/*
@@ -409,7 +413,8 @@ struct bfa_ioc_attr_s {
409 u8 port_mode; /* bfa_mode_s */ 413 u8 port_mode; /* bfa_mode_s */
410 u8 cap_bm; /* capability */ 414 u8 cap_bm; /* capability */
411 u8 port_mode_cfg; /* bfa_mode_s */ 415 u8 port_mode_cfg; /* bfa_mode_s */
412 u8 rsvd[4]; /* 64bit align */ 416 u8 def_fn; /* 1 if default fn */
417 u8 rsvd[3]; /* 64bit align */
413}; 418};
414 419
415/* 420/*
diff --git a/drivers/scsi/bfa/bfa_fcs.h b/drivers/scsi/bfa/bfa_fcs.h
index 4f1e650f3320..94d5d0102f7d 100644
--- a/drivers/scsi/bfa/bfa_fcs.h
+++ b/drivers/scsi/bfa/bfa_fcs.h
@@ -243,19 +243,19 @@ struct bfa_fcs_fabric_s;
243 * Symbolic Name. 243 * Symbolic Name.
244 * 244 *
245 * Physical Port's symbolic name Format : (Total 128 bytes) 245 * Physical Port's symbolic name Format : (Total 128 bytes)
246 * Adapter Model number/name : 12 bytes 246 * Adapter Model number/name : 16 bytes
247 * Driver Version : 10 bytes 247 * Driver Version : 10 bytes
248 * Host Machine Name : 30 bytes 248 * Host Machine Name : 30 bytes
249 * Host OS Info : 48 bytes 249 * Host OS Info : 44 bytes
250 * Host OS PATCH Info : 16 bytes 250 * Host OS PATCH Info : 16 bytes
251 * ( remaining 12 bytes reserved to be used for separator) 251 * ( remaining 12 bytes reserved to be used for separator)
252 */ 252 */
253#define BFA_FCS_PORT_SYMBNAME_SEPARATOR " | " 253#define BFA_FCS_PORT_SYMBNAME_SEPARATOR " | "
254 254
255#define BFA_FCS_PORT_SYMBNAME_MODEL_SZ 12 255#define BFA_FCS_PORT_SYMBNAME_MODEL_SZ 16
256#define BFA_FCS_PORT_SYMBNAME_VERSION_SZ 10 256#define BFA_FCS_PORT_SYMBNAME_VERSION_SZ 10
257#define BFA_FCS_PORT_SYMBNAME_MACHINENAME_SZ 30 257#define BFA_FCS_PORT_SYMBNAME_MACHINENAME_SZ 30
258#define BFA_FCS_PORT_SYMBNAME_OSINFO_SZ 48 258#define BFA_FCS_PORT_SYMBNAME_OSINFO_SZ 44
259#define BFA_FCS_PORT_SYMBNAME_OSPATCH_SZ 16 259#define BFA_FCS_PORT_SYMBNAME_OSPATCH_SZ 16
260 260
261/* 261/*
diff --git a/drivers/scsi/bfa/bfa_ioc.c b/drivers/scsi/bfa/bfa_ioc.c
index 8928b68551c3..c31cb3ca07eb 100644
--- a/drivers/scsi/bfa/bfa_ioc.c
+++ b/drivers/scsi/bfa/bfa_ioc.c
@@ -2508,6 +2508,7 @@ bfa_ioc_get_adapter_attr(struct bfa_ioc_s *ioc,
2508 ad_attr->mfg_day = ioc_attr->mfg_day; 2508 ad_attr->mfg_day = ioc_attr->mfg_day;
2509 ad_attr->mfg_month = ioc_attr->mfg_month; 2509 ad_attr->mfg_month = ioc_attr->mfg_month;
2510 ad_attr->mfg_year = ioc_attr->mfg_year; 2510 ad_attr->mfg_year = ioc_attr->mfg_year;
2511 memcpy(ad_attr->uuid, ioc_attr->uuid, BFA_ADAPTER_UUID_LEN);
2511} 2512}
2512 2513
2513enum bfa_ioc_type_e 2514enum bfa_ioc_type_e
@@ -2572,13 +2573,19 @@ void
2572bfa_ioc_get_adapter_model(struct bfa_ioc_s *ioc, char *model) 2573bfa_ioc_get_adapter_model(struct bfa_ioc_s *ioc, char *model)
2573{ 2574{
2574 struct bfi_ioc_attr_s *ioc_attr; 2575 struct bfi_ioc_attr_s *ioc_attr;
2576 u8 nports = bfa_ioc_get_nports(ioc);
2575 2577
2576 WARN_ON(!model); 2578 WARN_ON(!model);
2577 memset((void *)model, 0, BFA_ADAPTER_MODEL_NAME_LEN); 2579 memset((void *)model, 0, BFA_ADAPTER_MODEL_NAME_LEN);
2578 2580
2579 ioc_attr = ioc->attr; 2581 ioc_attr = ioc->attr;
2580 2582
2581 snprintf(model, BFA_ADAPTER_MODEL_NAME_LEN, "%s-%u", 2583 if (bfa_asic_id_ct2(ioc->pcidev.device_id) &&
2584 (!bfa_mfg_is_mezz(ioc_attr->card_type)))
2585 snprintf(model, BFA_ADAPTER_MODEL_NAME_LEN, "%s-%u-%u%s",
2586 BFA_MFG_NAME, ioc_attr->card_type, nports, "p");
2587 else
2588 snprintf(model, BFA_ADAPTER_MODEL_NAME_LEN, "%s-%u",
2582 BFA_MFG_NAME, ioc_attr->card_type); 2589 BFA_MFG_NAME, ioc_attr->card_type);
2583} 2590}
2584 2591
@@ -2628,7 +2635,7 @@ bfa_ioc_get_attr(struct bfa_ioc_s *ioc, struct bfa_ioc_attr_s *ioc_attr)
2628 memset((void *)ioc_attr, 0, sizeof(struct bfa_ioc_attr_s)); 2635 memset((void *)ioc_attr, 0, sizeof(struct bfa_ioc_attr_s));
2629 2636
2630 ioc_attr->state = bfa_ioc_get_state(ioc); 2637 ioc_attr->state = bfa_ioc_get_state(ioc);
2631 ioc_attr->port_id = ioc->port_id; 2638 ioc_attr->port_id = bfa_ioc_portid(ioc);
2632 ioc_attr->port_mode = ioc->port_mode; 2639 ioc_attr->port_mode = ioc->port_mode;
2633 ioc_attr->port_mode_cfg = ioc->port_mode_cfg; 2640 ioc_attr->port_mode_cfg = ioc->port_mode_cfg;
2634 ioc_attr->cap_bm = ioc->ad_cap_bm; 2641 ioc_attr->cap_bm = ioc->ad_cap_bm;
@@ -2637,8 +2644,9 @@ bfa_ioc_get_attr(struct bfa_ioc_s *ioc, struct bfa_ioc_attr_s *ioc_attr)
2637 2644
2638 bfa_ioc_get_adapter_attr(ioc, &ioc_attr->adapter_attr); 2645 bfa_ioc_get_adapter_attr(ioc, &ioc_attr->adapter_attr);
2639 2646
2640 ioc_attr->pci_attr.device_id = ioc->pcidev.device_id; 2647 ioc_attr->pci_attr.device_id = bfa_ioc_devid(ioc);
2641 ioc_attr->pci_attr.pcifn = ioc->pcidev.pci_func; 2648 ioc_attr->pci_attr.pcifn = bfa_ioc_pcifn(ioc);
2649 ioc_attr->def_fn = (bfa_ioc_pcifn(ioc) == bfa_ioc_portid(ioc));
2642 bfa_ioc_get_pci_chip_rev(ioc, ioc_attr->pci_attr.chip_rev); 2650 bfa_ioc_get_pci_chip_rev(ioc, ioc_attr->pci_attr.chip_rev);
2643} 2651}
2644 2652
@@ -6018,6 +6026,7 @@ bfa_fru_write_send(void *cbarg, enum bfi_fru_h2i_msgs msg_type)
6018 */ 6026 */
6019 msg->last = (len == fru->residue) ? 1 : 0; 6027 msg->last = (len == fru->residue) ? 1 : 0;
6020 6028
6029 msg->trfr_cmpl = (len == fru->residue) ? fru->trfr_cmpl : 0;
6021 bfi_h2i_set(msg->mh, BFI_MC_FRU, msg_type, bfa_ioc_portid(fru->ioc)); 6030 bfi_h2i_set(msg->mh, BFI_MC_FRU, msg_type, bfa_ioc_portid(fru->ioc));
6022 bfa_alen_set(&msg->alen, len, fru->dbuf_pa); 6031 bfa_alen_set(&msg->alen, len, fru->dbuf_pa);
6023 6032
@@ -6132,13 +6141,14 @@ bfa_fru_memclaim(struct bfa_fru_s *fru, u8 *dm_kva, u64 dm_pa,
6132 */ 6141 */
6133bfa_status_t 6142bfa_status_t
6134bfa_fruvpd_update(struct bfa_fru_s *fru, void *buf, u32 len, u32 offset, 6143bfa_fruvpd_update(struct bfa_fru_s *fru, void *buf, u32 len, u32 offset,
6135 bfa_cb_fru_t cbfn, void *cbarg) 6144 bfa_cb_fru_t cbfn, void *cbarg, u8 trfr_cmpl)
6136{ 6145{
6137 bfa_trc(fru, BFI_FRUVPD_H2I_WRITE_REQ); 6146 bfa_trc(fru, BFI_FRUVPD_H2I_WRITE_REQ);
6138 bfa_trc(fru, len); 6147 bfa_trc(fru, len);
6139 bfa_trc(fru, offset); 6148 bfa_trc(fru, offset);
6140 6149
6141 if (fru->ioc->asic_gen != BFI_ASIC_GEN_CT2) 6150 if (fru->ioc->asic_gen != BFI_ASIC_GEN_CT2 &&
6151 fru->ioc->attr->card_type != BFA_MFG_TYPE_CHINOOK2)
6142 return BFA_STATUS_FRU_NOT_PRESENT; 6152 return BFA_STATUS_FRU_NOT_PRESENT;
6143 6153
6144 if (fru->ioc->attr->card_type != BFA_MFG_TYPE_CHINOOK) 6154 if (fru->ioc->attr->card_type != BFA_MFG_TYPE_CHINOOK)
@@ -6160,6 +6170,7 @@ bfa_fruvpd_update(struct bfa_fru_s *fru, void *buf, u32 len, u32 offset,
6160 fru->offset = 0; 6170 fru->offset = 0;
6161 fru->addr_off = offset; 6171 fru->addr_off = offset;
6162 fru->ubuf = buf; 6172 fru->ubuf = buf;
6173 fru->trfr_cmpl = trfr_cmpl;
6163 6174
6164 bfa_fru_write_send(fru, BFI_FRUVPD_H2I_WRITE_REQ); 6175 bfa_fru_write_send(fru, BFI_FRUVPD_H2I_WRITE_REQ);
6165 6176
@@ -6189,7 +6200,8 @@ bfa_fruvpd_read(struct bfa_fru_s *fru, void *buf, u32 len, u32 offset,
6189 if (fru->ioc->asic_gen != BFI_ASIC_GEN_CT2) 6200 if (fru->ioc->asic_gen != BFI_ASIC_GEN_CT2)
6190 return BFA_STATUS_FRU_NOT_PRESENT; 6201 return BFA_STATUS_FRU_NOT_PRESENT;
6191 6202
6192 if (fru->ioc->attr->card_type != BFA_MFG_TYPE_CHINOOK) 6203 if (fru->ioc->attr->card_type != BFA_MFG_TYPE_CHINOOK &&
6204 fru->ioc->attr->card_type != BFA_MFG_TYPE_CHINOOK2)
6193 return BFA_STATUS_CMD_NOTSUPP; 6205 return BFA_STATUS_CMD_NOTSUPP;
6194 6206
6195 if (!bfa_ioc_is_operational(fru->ioc)) 6207 if (!bfa_ioc_is_operational(fru->ioc))
@@ -6230,7 +6242,8 @@ bfa_fruvpd_get_max_size(struct bfa_fru_s *fru, u32 *max_size)
6230 if (!bfa_ioc_is_operational(fru->ioc)) 6242 if (!bfa_ioc_is_operational(fru->ioc))
6231 return BFA_STATUS_IOC_NON_OP; 6243 return BFA_STATUS_IOC_NON_OP;
6232 6244
6233 if (fru->ioc->attr->card_type == BFA_MFG_TYPE_CHINOOK) 6245 if (fru->ioc->attr->card_type == BFA_MFG_TYPE_CHINOOK ||
6246 fru->ioc->attr->card_type == BFA_MFG_TYPE_CHINOOK2)
6234 *max_size = BFA_FRU_CHINOOK_MAX_SIZE; 6247 *max_size = BFA_FRU_CHINOOK_MAX_SIZE;
6235 else 6248 else
6236 return BFA_STATUS_CMD_NOTSUPP; 6249 return BFA_STATUS_CMD_NOTSUPP;
diff --git a/drivers/scsi/bfa/bfa_ioc.h b/drivers/scsi/bfa/bfa_ioc.h
index de62b68beb64..90814fe85ac1 100644
--- a/drivers/scsi/bfa/bfa_ioc.h
+++ b/drivers/scsi/bfa/bfa_ioc.h
@@ -731,6 +731,7 @@ struct bfa_fru_s {
731 struct bfa_mbox_cmd_s mb; /* mailbox */ 731 struct bfa_mbox_cmd_s mb; /* mailbox */
732 struct bfa_ioc_notify_s ioc_notify; /* ioc event notify */ 732 struct bfa_ioc_notify_s ioc_notify; /* ioc event notify */
733 struct bfa_mem_dma_s fru_dma; 733 struct bfa_mem_dma_s fru_dma;
734 u8 trfr_cmpl;
734}; 735};
735 736
736#define BFA_FRU(__bfa) (&(__bfa)->modules.fru) 737#define BFA_FRU(__bfa) (&(__bfa)->modules.fru)
@@ -738,7 +739,7 @@ struct bfa_fru_s {
738 739
739bfa_status_t bfa_fruvpd_update(struct bfa_fru_s *fru, 740bfa_status_t bfa_fruvpd_update(struct bfa_fru_s *fru,
740 void *buf, u32 len, u32 offset, 741 void *buf, u32 len, u32 offset,
741 bfa_cb_fru_t cbfn, void *cbarg); 742 bfa_cb_fru_t cbfn, void *cbarg, u8 trfr_cmpl);
742bfa_status_t bfa_fruvpd_read(struct bfa_fru_s *fru, 743bfa_status_t bfa_fruvpd_read(struct bfa_fru_s *fru,
743 void *buf, u32 len, u32 offset, 744 void *buf, u32 len, u32 offset,
744 bfa_cb_fru_t cbfn, void *cbarg); 745 bfa_cb_fru_t cbfn, void *cbarg);
diff --git a/drivers/scsi/bfa/bfad_bsg.c b/drivers/scsi/bfa/bfad_bsg.c
index 9863b1c2e567..0467c349251a 100644
--- a/drivers/scsi/bfa/bfad_bsg.c
+++ b/drivers/scsi/bfa/bfad_bsg.c
@@ -2716,7 +2716,7 @@ bfad_iocmd_fruvpd_update(struct bfad_s *bfad, void *cmd)
2716 spin_lock_irqsave(&bfad->bfad_lock, flags); 2716 spin_lock_irqsave(&bfad->bfad_lock, flags);
2717 iocmd->status = bfa_fruvpd_update(BFA_FRU(&bfad->bfa), 2717 iocmd->status = bfa_fruvpd_update(BFA_FRU(&bfad->bfa),
2718 &iocmd->data, iocmd->len, iocmd->offset, 2718 &iocmd->data, iocmd->len, iocmd->offset,
2719 bfad_hcb_comp, &fcomp); 2719 bfad_hcb_comp, &fcomp, iocmd->trfr_cmpl);
2720 spin_unlock_irqrestore(&bfad->bfad_lock, flags); 2720 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
2721 if (iocmd->status == BFA_STATUS_OK) { 2721 if (iocmd->status == BFA_STATUS_OK) {
2722 wait_for_completion(&fcomp.comp); 2722 wait_for_completion(&fcomp.comp);
diff --git a/drivers/scsi/bfa/bfad_bsg.h b/drivers/scsi/bfa/bfad_bsg.h
index b0b5ac7a75ff..05f0fc9cf063 100644
--- a/drivers/scsi/bfa/bfad_bsg.h
+++ b/drivers/scsi/bfa/bfad_bsg.h
@@ -794,10 +794,12 @@ struct bfa_bsg_tfru_s {
794struct bfa_bsg_fruvpd_s { 794struct bfa_bsg_fruvpd_s {
795 bfa_status_t status; 795 bfa_status_t status;
796 u16 bfad_num; 796 u16 bfad_num;
797 u16 rsvd; 797 u16 rsvd1;
798 u32 offset; 798 u32 offset;
799 u32 len; 799 u32 len;
800 u8 data[BFA_MAX_FRUVPD_TRANSFER_SIZE]; 800 u8 data[BFA_MAX_FRUVPD_TRANSFER_SIZE];
801 u8 trfr_cmpl;
802 u8 rsvd2[3];
801}; 803};
802 804
803struct bfa_bsg_fruvpd_max_size_s { 805struct bfa_bsg_fruvpd_max_size_s {
diff --git a/drivers/scsi/bfa/bfi.h b/drivers/scsi/bfa/bfi.h
index bf0a58d03be8..37bd2564e83b 100644
--- a/drivers/scsi/bfa/bfi.h
+++ b/drivers/scsi/bfa/bfi.h
@@ -264,6 +264,7 @@ struct bfi_ioc_getattr_req_s {
264 union bfi_addr_u attr_addr; 264 union bfi_addr_u attr_addr;
265}; 265};
266 266
267#define BFI_IOC_ATTR_UUID_SZ 16
267struct bfi_ioc_attr_s { 268struct bfi_ioc_attr_s {
268 wwn_t mfg_pwwn; /* Mfg port wwn */ 269 wwn_t mfg_pwwn; /* Mfg port wwn */
269 wwn_t mfg_nwwn; /* Mfg node wwn */ 270 wwn_t mfg_nwwn; /* Mfg node wwn */
@@ -292,6 +293,7 @@ struct bfi_ioc_attr_s {
292 u8 mfg_day; /* manufacturing day */ 293 u8 mfg_day; /* manufacturing day */
293 u8 mfg_month; /* manufacturing month */ 294 u8 mfg_month; /* manufacturing month */
294 u16 mfg_year; /* manufacturing year */ 295 u16 mfg_year; /* manufacturing year */
296 u8 uuid[BFI_IOC_ATTR_UUID_SZ]; /*!< chinook uuid */
295}; 297};
296 298
297/* 299/*
@@ -1253,7 +1255,9 @@ enum bfi_fru_i2h_msgs {
1253struct bfi_fru_write_req_s { 1255struct bfi_fru_write_req_s {
1254 struct bfi_mhdr_s mh; /* Common msg header */ 1256 struct bfi_mhdr_s mh; /* Common msg header */
1255 u8 last; 1257 u8 last;
1256 u8 rsv[3]; 1258 u8 rsv_1[3];
1259 u8 trfr_cmpl;
1260 u8 rsv_2[3];
1257 u32 offset; 1261 u32 offset;
1258 u32 length; 1262 u32 length;
1259 struct bfi_alen_s alen; 1263 struct bfi_alen_s alen;