[SCSI] pm80xx: WWN Modification for PM8081/88/89 controllers
Individual WWN read operations based on controller. PM8081 - Read WWN from Flash VPD. PM8088/89 - Read WWN from EEPROM. PM8001 - Read WWN from NVM. Signed-off-by: Sakthivel K <Sakthivel.SaravananKamalRaju@pmcs.com> Signed-off-by: Anand Kumar S <AnandKumar.Santhanam@pmcs.com> Acked-by: Jack Wang <jack_wang@usish.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
committed by
James Bottomley
parent
a70b8fc3a5
commit
a33a0155da
@@ -605,21 +605,50 @@ static void pm8001_post_sas_ha_init(struct Scsi_Host *shost,
|
|||||||
*/
|
*/
|
||||||
static void pm8001_init_sas_add(struct pm8001_hba_info *pm8001_ha)
|
static void pm8001_init_sas_add(struct pm8001_hba_info *pm8001_ha)
|
||||||
{
|
{
|
||||||
u8 i;
|
u8 i, j;
|
||||||
#ifdef PM8001_READ_VPD
|
#ifdef PM8001_READ_VPD
|
||||||
|
/* For new SPC controllers WWN is stored in flash vpd
|
||||||
|
* For SPC/SPCve controllers WWN is stored in EEPROM
|
||||||
|
* For Older SPC WWN is stored in NVMD
|
||||||
|
*/
|
||||||
DECLARE_COMPLETION_ONSTACK(completion);
|
DECLARE_COMPLETION_ONSTACK(completion);
|
||||||
struct pm8001_ioctl_payload payload;
|
struct pm8001_ioctl_payload payload;
|
||||||
|
u16 deviceid;
|
||||||
|
pci_read_config_word(pm8001_ha->pdev, PCI_DEVICE_ID, &deviceid);
|
||||||
pm8001_ha->nvmd_completion = &completion;
|
pm8001_ha->nvmd_completion = &completion;
|
||||||
payload.minor_function = 0;
|
|
||||||
payload.length = 128;
|
if (pm8001_ha->chip_id == chip_8001) {
|
||||||
payload.func_specific = kzalloc(128, GFP_KERNEL);
|
if (deviceid == 0x8081) {
|
||||||
|
payload.minor_function = 4;
|
||||||
|
payload.length = 4096;
|
||||||
|
} else {
|
||||||
|
payload.minor_function = 0;
|
||||||
|
payload.length = 128;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
payload.minor_function = 1;
|
||||||
|
payload.length = 4096;
|
||||||
|
}
|
||||||
|
payload.offset = 0;
|
||||||
|
payload.func_specific = kzalloc(payload.length, GFP_KERNEL);
|
||||||
PM8001_CHIP_DISP->get_nvmd_req(pm8001_ha, &payload);
|
PM8001_CHIP_DISP->get_nvmd_req(pm8001_ha, &payload);
|
||||||
wait_for_completion(&completion);
|
wait_for_completion(&completion);
|
||||||
|
|
||||||
|
for (i = 0, j = 0; i <= 7; i++, j++) {
|
||||||
|
if (pm8001_ha->chip_id == chip_8001) {
|
||||||
|
if (deviceid == 0x8081)
|
||||||
|
pm8001_ha->sas_addr[j] =
|
||||||
|
payload.func_specific[0x704 + i];
|
||||||
|
} else
|
||||||
|
pm8001_ha->sas_addr[j] =
|
||||||
|
payload.func_specific[0x804 + i];
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < pm8001_ha->chip->n_phy; i++) {
|
for (i = 0; i < pm8001_ha->chip->n_phy; i++) {
|
||||||
memcpy(&pm8001_ha->phy[i].dev_sas_addr, pm8001_ha->sas_addr,
|
memcpy(&pm8001_ha->phy[i].dev_sas_addr,
|
||||||
SAS_ADDR_SIZE);
|
pm8001_ha->sas_addr, SAS_ADDR_SIZE);
|
||||||
PM8001_INIT_DBG(pm8001_ha,
|
PM8001_INIT_DBG(pm8001_ha,
|
||||||
pm8001_printk("phy %d sas_addr = %016llx \n", i,
|
pm8001_printk("phy %d sas_addr = %016llx\n", i,
|
||||||
pm8001_ha->phy[i].dev_sas_addr));
|
pm8001_ha->phy[i].dev_sas_addr));
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
Reference in New Issue
Block a user