[SCSI] mptsas: support link error attributes
.. and the fusion part. I had to move around the debug functions around a little bit so they are below the transport class methods. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
28f22b031f
commit
b514112802
1 changed files with 161 additions and 81 deletions
|
@ -123,6 +123,101 @@ struct mptsas_portinfo {
|
|||
struct mptsas_phyinfo *phy_info;
|
||||
};
|
||||
|
||||
|
||||
#ifdef SASDEBUG
|
||||
static void mptsas_print_phy_data(MPI_SAS_IO_UNIT0_PHY_DATA *phy_data)
|
||||
{
|
||||
printk("---- IO UNIT PAGE 0 ------------\n");
|
||||
printk("Handle=0x%X\n",
|
||||
le16_to_cpu(phy_data->AttachedDeviceHandle));
|
||||
printk("Controller Handle=0x%X\n",
|
||||
le16_to_cpu(phy_data->ControllerDevHandle));
|
||||
printk("Port=0x%X\n", phy_data->Port);
|
||||
printk("Port Flags=0x%X\n", phy_data->PortFlags);
|
||||
printk("PHY Flags=0x%X\n", phy_data->PhyFlags);
|
||||
printk("Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate);
|
||||
printk("Controller PHY Device Info=0x%X\n",
|
||||
le32_to_cpu(phy_data->ControllerPhyDeviceInfo));
|
||||
printk("DiscoveryStatus=0x%X\n",
|
||||
le32_to_cpu(phy_data->DiscoveryStatus));
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
static void mptsas_print_phy_pg0(SasPhyPage0_t *pg0)
|
||||
{
|
||||
__le64 sas_address;
|
||||
|
||||
memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
|
||||
|
||||
printk("---- SAS PHY PAGE 0 ------------\n");
|
||||
printk("Attached Device Handle=0x%X\n",
|
||||
le16_to_cpu(pg0->AttachedDevHandle));
|
||||
printk("SAS Address=0x%llX\n",
|
||||
(unsigned long long)le64_to_cpu(sas_address));
|
||||
printk("Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier);
|
||||
printk("Attached Device Info=0x%X\n",
|
||||
le32_to_cpu(pg0->AttachedDeviceInfo));
|
||||
printk("Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate);
|
||||
printk("Change Count=0x%X\n", pg0->ChangeCount);
|
||||
printk("PHY Info=0x%X\n", le32_to_cpu(pg0->PhyInfo));
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
static void mptsas_print_phy_pg1(SasPhyPage1_t *pg1)
|
||||
{
|
||||
printk("---- SAS PHY PAGE 1 ------------\n");
|
||||
printk("Invalid Dword Count=0x%x\n", pg1->InvalidDwordCount);
|
||||
printk("Running Disparity Error Count=0x%x\n",
|
||||
pg1->RunningDisparityErrorCount);
|
||||
printk("Loss Dword Synch Count=0x%x\n", pg1->LossDwordSynchCount);
|
||||
printk("PHY Reset Problem Count=0x%x\n", pg1->PhyResetProblemCount);
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
static void mptsas_print_device_pg0(SasDevicePage0_t *pg0)
|
||||
{
|
||||
__le64 sas_address;
|
||||
|
||||
memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
|
||||
|
||||
printk("---- SAS DEVICE PAGE 0 ---------\n");
|
||||
printk("Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle));
|
||||
printk("Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle));
|
||||
printk("Slot=0x%X\n", le16_to_cpu(pg0->Slot));
|
||||
printk("SAS Address=0x%llX\n", le64_to_cpu(sas_address));
|
||||
printk("Target ID=0x%X\n", pg0->TargetID);
|
||||
printk("Bus=0x%X\n", pg0->Bus);
|
||||
printk("PhyNum=0x%X\n", pg0->PhyNum);
|
||||
printk("AccessStatus=0x%X\n", le16_to_cpu(pg0->AccessStatus));
|
||||
printk("Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo));
|
||||
printk("Flags=0x%X\n", le16_to_cpu(pg0->Flags));
|
||||
printk("Physical Port=0x%X\n", pg0->PhysicalPort);
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
static void mptsas_print_expander_pg1(SasExpanderPage1_t *pg1)
|
||||
{
|
||||
printk("---- SAS EXPANDER PAGE 1 ------------\n");
|
||||
|
||||
printk("Physical Port=0x%X\n", pg1->PhysicalPort);
|
||||
printk("PHY Identifier=0x%X\n", pg1->Phy);
|
||||
printk("Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate);
|
||||
printk("Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate);
|
||||
printk("Hardware Link Rate=0x%X\n", pg1->HwLinkRate);
|
||||
printk("Owner Device Handle=0x%X\n",
|
||||
le16_to_cpu(pg1->OwnerDevHandle));
|
||||
printk("Attached Device Handle=0x%X\n",
|
||||
le16_to_cpu(pg1->AttachedDevHandle));
|
||||
}
|
||||
#else
|
||||
#define mptsas_print_phy_data(phy_data) do { } while (0)
|
||||
#define mptsas_print_phy_pg0(pg0) do { } while (0)
|
||||
#define mptsas_print_phy_pg1(pg1) do { } while (0)
|
||||
#define mptsas_print_device_pg0(pg0) do { } while (0)
|
||||
#define mptsas_print_expander_pg1(pg1) do { } while (0)
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* This is pretty ugly. We will be able to seriously clean it up
|
||||
* once the DV code in mptscsih goes away and we can properly
|
||||
|
@ -200,92 +295,77 @@ static struct scsi_host_template mptsas_driver_template = {
|
|||
.use_clustering = ENABLE_CLUSTERING,
|
||||
};
|
||||
|
||||
static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy)
|
||||
{
|
||||
struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
|
||||
return ((MPT_SCSI_HOST *)shost->hostdata)->ioc;
|
||||
}
|
||||
|
||||
static int mptsas_get_linkerrors(struct sas_phy *phy)
|
||||
{
|
||||
MPT_ADAPTER *ioc = phy_to_ioc(phy);
|
||||
ConfigExtendedPageHeader_t hdr;
|
||||
CONFIGPARMS cfg;
|
||||
SasPhyPage1_t *buffer;
|
||||
dma_addr_t dma_handle;
|
||||
int error;
|
||||
|
||||
hdr.PageVersion = MPI_SASPHY1_PAGEVERSION;
|
||||
hdr.ExtPageLength = 0;
|
||||
hdr.PageNumber = 1 /* page number 1*/;
|
||||
hdr.Reserved1 = 0;
|
||||
hdr.Reserved2 = 0;
|
||||
hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
|
||||
hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY;
|
||||
|
||||
cfg.cfghdr.ehdr = &hdr;
|
||||
cfg.physAddr = -1;
|
||||
cfg.pageAddr = phy->identify.phy_identifier;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
cfg.dir = 0; /* read */
|
||||
cfg.timeout = 10;
|
||||
|
||||
error = mpt_config(ioc, &cfg);
|
||||
if (error)
|
||||
return error;
|
||||
if (!hdr.ExtPageLength)
|
||||
return -ENXIO;
|
||||
|
||||
buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
|
||||
&dma_handle);
|
||||
if (!buffer)
|
||||
return -ENOMEM;
|
||||
|
||||
cfg.physAddr = dma_handle;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
|
||||
|
||||
error = mpt_config(ioc, &cfg);
|
||||
if (error)
|
||||
goto out_free_consistent;
|
||||
|
||||
mptsas_print_phy_pg1(buffer);
|
||||
|
||||
phy->invalid_dword_count = le32_to_cpu(buffer->InvalidDwordCount);
|
||||
phy->running_disparity_error_count =
|
||||
le32_to_cpu(buffer->RunningDisparityErrorCount);
|
||||
phy->loss_of_dword_sync_count =
|
||||
le32_to_cpu(buffer->LossDwordSynchCount);
|
||||
phy->phy_reset_problem_count =
|
||||
le32_to_cpu(buffer->PhyResetProblemCount);
|
||||
|
||||
out_free_consistent:
|
||||
pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
|
||||
buffer, dma_handle);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
static struct sas_function_template mptsas_transport_functions = {
|
||||
.get_linkerrors = mptsas_get_linkerrors,
|
||||
};
|
||||
|
||||
static struct scsi_transport_template *mptsas_transport_template;
|
||||
|
||||
#ifdef SASDEBUG
|
||||
static void mptsas_print_phy_data(MPI_SAS_IO_UNIT0_PHY_DATA *phy_data)
|
||||
{
|
||||
printk("---- IO UNIT PAGE 0 ------------\n");
|
||||
printk("Handle=0x%X\n",
|
||||
le16_to_cpu(phy_data->AttachedDeviceHandle));
|
||||
printk("Controller Handle=0x%X\n",
|
||||
le16_to_cpu(phy_data->ControllerDevHandle));
|
||||
printk("Port=0x%X\n", phy_data->Port);
|
||||
printk("Port Flags=0x%X\n", phy_data->PortFlags);
|
||||
printk("PHY Flags=0x%X\n", phy_data->PhyFlags);
|
||||
printk("Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate);
|
||||
printk("Controller PHY Device Info=0x%X\n",
|
||||
le32_to_cpu(phy_data->ControllerPhyDeviceInfo));
|
||||
printk("DiscoveryStatus=0x%X\n",
|
||||
le32_to_cpu(phy_data->DiscoveryStatus));
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
static void mptsas_print_phy_pg0(SasPhyPage0_t *pg0)
|
||||
{
|
||||
__le64 sas_address;
|
||||
|
||||
memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
|
||||
|
||||
printk("---- SAS PHY PAGE 0 ------------\n");
|
||||
printk("Attached Device Handle=0x%X\n",
|
||||
le16_to_cpu(pg0->AttachedDevHandle));
|
||||
printk("SAS Address=0x%llX\n",
|
||||
(unsigned long long)le64_to_cpu(sas_address));
|
||||
printk("Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier);
|
||||
printk("Attached Device Info=0x%X\n",
|
||||
le32_to_cpu(pg0->AttachedDeviceInfo));
|
||||
printk("Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate);
|
||||
printk("Change Count=0x%X\n", pg0->ChangeCount);
|
||||
printk("PHY Info=0x%X\n", le32_to_cpu(pg0->PhyInfo));
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
static void mptsas_print_device_pg0(SasDevicePage0_t *pg0)
|
||||
{
|
||||
__le64 sas_address;
|
||||
|
||||
memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
|
||||
|
||||
printk("---- SAS DEVICE PAGE 0 ---------\n");
|
||||
printk("Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle));
|
||||
printk("Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle));
|
||||
printk("Slot=0x%X\n", le16_to_cpu(pg0->Slot));
|
||||
printk("SAS Address=0x%llX\n", le64_to_cpu(sas_address));
|
||||
printk("Target ID=0x%X\n", pg0->TargetID);
|
||||
printk("Bus=0x%X\n", pg0->Bus);
|
||||
printk("Parent Phy Num=0x%X\n", pg0->PhyNum);
|
||||
printk("Access Status=0x%X\n", le16_to_cpu(pg0->AccessStatus));
|
||||
printk("Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo));
|
||||
printk("Flags=0x%X\n", le16_to_cpu(pg0->Flags));
|
||||
printk("Physical Port=0x%X\n", pg0->PhysicalPort);
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
static void mptsas_print_expander_pg1(SasExpanderPage1_t *pg1)
|
||||
{
|
||||
printk("---- SAS EXPANDER PAGE 1 ------------\n");
|
||||
|
||||
printk("Physical Port=0x%X\n", pg1->PhysicalPort);
|
||||
printk("PHY Identifier=0x%X\n", pg1->PhyIdentifier);
|
||||
printk("Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate);
|
||||
printk("Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate);
|
||||
printk("Hardware Link Rate=0x%X\n", pg1->HwLinkRate);
|
||||
printk("Owner Device Handle=0x%X\n",
|
||||
le16_to_cpu(pg1->OwnerDevHandle));
|
||||
printk("Attached Device Handle=0x%X\n",
|
||||
le16_to_cpu(pg1->AttachedDevHandle));
|
||||
}
|
||||
#else
|
||||
#define mptsas_print_phy_data(phy_data) do { } while (0)
|
||||
#define mptsas_print_phy_pg0(pg0) do { } while (0)
|
||||
#define mptsas_print_device_pg0(pg0) do { } while (0)
|
||||
#define mptsas_print_expander_pg1(pg1) do { } while (0)
|
||||
#endif
|
||||
|
||||
static int
|
||||
mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue