RE: [PATCH V2 05/10] pm80xx: Phy settings support for motherboard controller.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Phy settings support is only for Motherboard controller. Firmware will
only initialize default values for all PHY in case of motherboard
controller. Hence, this is mandatory to add this support in all
motherboard controllers to configure their own settings. 

-----Original Message-----
From: Jack Wang [mailto:xjtuwjp@xxxxxxxxx] 
Sent: Thursday, September 26, 2013 12:27 PM
To: Anand Kumar Santhanam
Cc: linux-scsi@xxxxxxxxxxxxxxx; Sangeetha Gnanasekaran; Nikith
Ganigarakoppal; Viswas G
Subject: Re: [PATCH V2 05/10] pm80xx: Phy settings support for
motherboard controller.

snip
>  #ifdef PM8001_USE_MSIX
>  /**
>   * pm8001_setup_msix - enable MSI-X interrupt @@ -847,6 +872,9 @@ 
> static int pm8001_pci_probe(struct pci_dev *pdev,
>  	}
>  
>  	pm8001_init_sas_add(pm8001_ha);
> +	/* phy setting support for motherboard controller */
> +	if (pdev->subsystem_vendor != PCI_VENDOR_ID_ADAPTEC2)
> +		pm8001_get_phy_settings_info(pm8001_ha);

Are you sure about this, have you checked all controller except device
with subsystem_vendorid is PCI_VENDOR_ID_ADAPTEC2 all support this
get_phy_setting_info funcion?

Jack
>  	pm8001_post_sas_ha_init(shost, chip);
>  	rc = sas_register_ha(SHOST_TO_SAS_HA(shost));
>  	if (rc)
> diff --git a/drivers/scsi/pm8001/pm8001_sas.h 
> b/drivers/scsi/pm8001/pm8001_sas.h
> index 68e1147..cbde11a 100644
> --- a/drivers/scsi/pm8001/pm8001_sas.h
> +++ b/drivers/scsi/pm8001/pm8001_sas.h
> @@ -632,7 +632,8 @@ struct pm8001_device *pm8001_find_dev(struct 
> pm8001_hba_info *pm8001_ha,  int pm80xx_set_thermal_config(struct 
> pm8001_hba_info *pm8001_ha);
>  
>  int pm8001_bar4_shift(struct pm8001_hba_info *pm8001_ha, u32 
> shiftValue);
> -
> +void pm8001_set_phy_profile(struct pm8001_hba_info *pm8001_ha,
> +	u32 length, u8 *buf);
>  /* ctl shared API */
>  extern struct device_attribute *pm8001_host_attrs[];
>  
> diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c 
> b/drivers/scsi/pm8001/pm80xx_hwi.c
> index 99cec5f..e1ab320 100644
> --- a/drivers/scsi/pm8001/pm80xx_hwi.c
> +++ b/drivers/scsi/pm8001/pm80xx_hwi.c
> @@ -3131,9 +3131,27 @@ static int mpi_flash_op_ext_resp(struct 
> pm8001_hba_info *pm8001_ha, void *piomb)  static int
mpi_set_phy_profile_resp(struct pm8001_hba_info *pm8001_ha,
>  			void *piomb)
>  {
> -	PM8001_MSG_DBG(pm8001_ha,
> -			pm8001_printk("
pm80xx_addition_functionality\n"));
> +	u8 page_code;
> +	struct set_phy_profile_resp *pPayload =
> +		(struct set_phy_profile_resp *)(piomb + 4);
> +	u32 ppc_phyid = le32_to_cpu(pPayload->ppc_phyid);
> +	u32 status = le32_to_cpu(pPayload->status);
>  
> +	page_code = (u8)((ppc_phyid & 0xFF00) >> 8);
> +	if (status) {
> +		/* status is FAILED */
> +		PM8001_FAIL_DBG(pm8001_ha,
> +			pm8001_printk("PhyProfile command failed  with
status "
> +			"0x%08X \n", status));
> +		return -1;
> +	} else {
> +		if (page_code != SAS_PHY_ANALOG_SETTINGS_PAGE) {
> +			PM8001_FAIL_DBG(pm8001_ha,
> +				pm8001_printk("Invalid page code
0x%X\n",
> +					page_code));
> +			return -1;
> +		}
> +	}
>  	return 0;
>  }
>  
> @@ -4128,6 +4146,45 @@ pm80xx_chip_isr(struct pm8001_hba_info
*pm8001_ha, u8 vec)
>  	return IRQ_HANDLED;
>  }
>  
> +void mpi_set_phy_profile_req(struct pm8001_hba_info *pm8001_ha,
> +	u32 operation, u32 phyid, u32 length, u32 *buf) {
> +	u32 tag , i, j = 0;
> +	int rc;
> +	struct set_phy_profile_req payload;
> +	struct inbound_queue_table *circularQ;
> +	u32 opc = OPC_INB_SET_PHY_PROFILE;
> +
> +	memset(&payload, 0, sizeof(payload));
> +	rc = pm8001_tag_alloc(pm8001_ha, &tag);
> +	if (rc)
> +		PM8001_FAIL_DBG(pm8001_ha, pm8001_printk("Invalid
tag\n"));
> +	circularQ = &pm8001_ha->inbnd_q_tbl[0];
> +	payload.tag = cpu_to_le32(tag);
> +	payload.ppc_phyid = (((operation & 0xF) << 8) | (phyid  &
0xFF));
> +	PM8001_INIT_DBG(pm8001_ha,
> +		pm8001_printk(" phy profile command for phy %x ,length
is %d\n",
> +			payload.ppc_phyid, length));
> +	for (i = length ; i < (length + PHY_DWORD_LENGTH - 1) ; i++) {
> +		payload.reserved[j] =  cpu_to_le32(*((u32 *)buf + i));
> +		j++;
> +	}
> +	pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0); }
> +
> +void pm8001_set_phy_profile(struct pm8001_hba_info *pm8001_ha,
> +	u32 length, u8 *buf)
> +{
> +	u32 page_code, i;
> +
> +	page_code = SAS_PHY_ANALOG_SETTINGS_PAGE;
> +	for (i = 0 ; i < pm8001_ha->chip->n_phy ; i++) {
> +		mpi_set_phy_profile_req(pm8001_ha,
> +			SAS_PHY_ANALOG_SETTINGS_PAGE, i, length, (u32
*)buf);
> +		length = length + PHY_DWORD_LENGTH;
> +	}
> +	PM8001_INIT_DBG(pm8001_ha, pm8001_printk("phy settings 
> +completed\n")); }
>  const struct pm8001_dispatch pm8001_80xx_dispatch = {
>  	.name			= "pmc80xx",
>  	.chip_init		= pm80xx_chip_init,
> diff --git a/drivers/scsi/pm8001/pm80xx_hwi.h 
> b/drivers/scsi/pm8001/pm80xx_hwi.h
> index 9a9116d..872d5cf 100644
> --- a/drivers/scsi/pm8001/pm80xx_hwi.h
> +++ b/drivers/scsi/pm8001/pm80xx_hwi.h
> @@ -170,6 +170,10 @@
>  #define LINKRATE_60			(0x06 << 8)
>  #define LINKRATE_120			(0x08 << 8)
>  
> +/* phy_profile */
> +#define SAS_PHY_ANALOG_SETTINGS_PAGE	0x04
> +#define PHY_DWORD_LENGTH		0xC
> +
>  /* Thermal related */
>  #define	THERMAL_ENABLE			0x1
>  #define	THERMAL_LOG_ENABLE		0x1
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux