From e1cb8752a5e075c20d027daa4c351ebee6c07dbc Mon Sep 17 00:00:00 2001 From: Sakthivel K Date: Tue, 19 Mar 2013 18:07:35 +0530 Subject: [PATCH] --- yaml --- r: 375423 b: refs/heads/master c: a33a0155dae5a8fdc85a9853ca06d6d57b90a4d9 h: refs/heads/master i: 375421: 4f5275b1c20ed5910074c9cf2c0f4975bcf26d9f 375419: c351da3adf9622ca137caf6cabac484e85042a74 375415: bed9c180c1fbd8234596bd7640cc507d64cf232a 375407: 71b81cbc153da0c36fda0a8015f9b00d88d9447f 375391: 90e35d5847a9747de82b1bf7d6d8db25bb5d9a4f 375359: 85ad5a715621f8528efe3fa78708e288d486381f 375295: 2ea8356490695bf042b2801550f592382e2841d5 v: v3 --- [refs] | 2 +- trunk/drivers/scsi/pm8001/pm8001_init.c | 43 +++++++++++++++++++++---- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index 1637548eb5ea..222f2692a284 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a70b8fc3a582694073c3676dba6a39e4e77f8727 +refs/heads/master: a33a0155dae5a8fdc85a9853ca06d6d57b90a4d9 diff --git a/trunk/drivers/scsi/pm8001/pm8001_init.c b/trunk/drivers/scsi/pm8001/pm8001_init.c index 0c14dc04194b..055f7d0e15d8 100644 --- a/trunk/drivers/scsi/pm8001/pm8001_init.c +++ b/trunk/drivers/scsi/pm8001/pm8001_init.c @@ -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) { - u8 i; + u8 i, j; #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); struct pm8001_ioctl_payload payload; + u16 deviceid; + pci_read_config_word(pm8001_ha->pdev, PCI_DEVICE_ID, &deviceid); pm8001_ha->nvmd_completion = &completion; - payload.minor_function = 0; - payload.length = 128; - payload.func_specific = kzalloc(128, GFP_KERNEL); + + if (pm8001_ha->chip_id == chip_8001) { + 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); 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++) { - memcpy(&pm8001_ha->phy[i].dev_sas_addr, pm8001_ha->sas_addr, - SAS_ADDR_SIZE); + memcpy(&pm8001_ha->phy[i].dev_sas_addr, + pm8001_ha->sas_addr, SAS_ADDR_SIZE); 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)); } #else