Commit b5141128 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by James Bottomley

[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: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 28f22b03
...@@ -123,6 +123,101 @@ struct mptsas_portinfo { ...@@ -123,6 +123,101 @@ struct mptsas_portinfo {
struct mptsas_phyinfo *phy_info; 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 * 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 * once the DV code in mptscsih goes away and we can properly
...@@ -200,91 +295,76 @@ static struct scsi_host_template mptsas_driver_template = { ...@@ -200,91 +295,76 @@ static struct scsi_host_template mptsas_driver_template = {
.use_clustering = ENABLE_CLUSTERING, .use_clustering = ENABLE_CLUSTERING,
}; };
static struct sas_function_template mptsas_transport_functions = { static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy)
};
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"); struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
printk("Handle=0x%X\n", return ((MPT_SCSI_HOST *)shost->hostdata)->ioc;
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) static int mptsas_get_linkerrors(struct sas_phy *phy)
{ {
__le64 sas_address; MPT_ADAPTER *ioc = phy_to_ioc(phy);
ConfigExtendedPageHeader_t hdr;
CONFIGPARMS cfg;
SasPhyPage1_t *buffer;
dma_addr_t dma_handle;
int error;
memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64)); 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;
printk("---- SAS PHY PAGE 0 ------------\n"); cfg.cfghdr.ehdr = &hdr;
printk("Attached Device Handle=0x%X\n", cfg.physAddr = -1;
le16_to_cpu(pg0->AttachedDevHandle)); cfg.pageAddr = phy->identify.phy_identifier;
printk("SAS Address=0x%llX\n", cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
(unsigned long long)le64_to_cpu(sas_address)); cfg.dir = 0; /* read */
printk("Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier); cfg.timeout = 10;
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) error = mpt_config(ioc, &cfg);
{ if (error)
__le64 sas_address; return error;
if (!hdr.ExtPageLength)
return -ENXIO;
memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64)); buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
&dma_handle);
if (!buffer)
return -ENOMEM;
printk("---- SAS DEVICE PAGE 0 ---------\n"); cfg.physAddr = dma_handle;
printk("Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle)); cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
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) error = mpt_config(ioc, &cfg);
{ if (error)
printk("---- SAS EXPANDER PAGE 1 ------------\n"); goto out_free_consistent;
printk("Physical Port=0x%X\n", pg1->PhysicalPort); mptsas_print_phy_pg1(buffer);
printk("PHY Identifier=0x%X\n", pg1->PhyIdentifier);
printk("Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate); phy->invalid_dword_count = le32_to_cpu(buffer->InvalidDwordCount);
printk("Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate); phy->running_disparity_error_count =
printk("Hardware Link Rate=0x%X\n", pg1->HwLinkRate); le32_to_cpu(buffer->RunningDisparityErrorCount);
printk("Owner Device Handle=0x%X\n", phy->loss_of_dword_sync_count =
le16_to_cpu(pg1->OwnerDevHandle)); le32_to_cpu(buffer->LossDwordSynchCount);
printk("Attached Device Handle=0x%X\n", phy->phy_reset_problem_count =
le16_to_cpu(pg1->AttachedDevHandle)); le32_to_cpu(buffer->PhyResetProblemCount);
out_free_consistent:
pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
buffer, dma_handle);
return error;
} }
#else
#define mptsas_print_phy_data(phy_data) do { } while (0)
#define mptsas_print_phy_pg0(pg0) do { } while (0) static struct sas_function_template mptsas_transport_functions = {
#define mptsas_print_device_pg0(pg0) do { } while (0) .get_linkerrors = mptsas_get_linkerrors,
#define mptsas_print_expander_pg1(pg1) do { } while (0) };
#endif
static struct scsi_transport_template *mptsas_transport_template;
static int static int
mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment