]> err.no Git - linux-2.6/blobdiff - drivers/scsi/libsas/sas_phy.c
libata: kill ata_noop_dev_select()
[linux-2.6] / drivers / scsi / libsas / sas_phy.c
index 024ab00e70d2e6e38dbf1c263d158b950736392c..b459c4b635b1b73dfe5e1ed5304f6bad5a6ee588 100644 (file)
 
 /* ---------- Phy events ---------- */
 
-static void sas_phye_loss_of_signal(void *data)
+static void sas_phye_loss_of_signal(struct work_struct *work)
 {
-       struct asd_sas_phy *phy = data;
+       struct asd_sas_event *ev =
+               container_of(work, struct asd_sas_event, work);
+       struct asd_sas_phy *phy = ev->phy;
 
        sas_begin_event(PHYE_LOSS_OF_SIGNAL, &phy->ha->event_lock,
                        &phy->phy_events_pending);
@@ -40,18 +42,22 @@ static void sas_phye_loss_of_signal(void *data)
        sas_deform_port(phy);
 }
 
-static void sas_phye_oob_done(void *data)
+static void sas_phye_oob_done(struct work_struct *work)
 {
-       struct asd_sas_phy *phy = data;
+       struct asd_sas_event *ev =
+               container_of(work, struct asd_sas_event, work);
+       struct asd_sas_phy *phy = ev->phy;
 
        sas_begin_event(PHYE_OOB_DONE, &phy->ha->event_lock,
                        &phy->phy_events_pending);
        phy->error = 0;
 }
 
-static void sas_phye_oob_error(void *data)
+static void sas_phye_oob_error(struct work_struct *work)
 {
-       struct asd_sas_phy *phy = data;
+       struct asd_sas_event *ev =
+               container_of(work, struct asd_sas_event, work);
+       struct asd_sas_phy *phy = ev->phy;
        struct sas_ha_struct *sas_ha = phy->ha;
        struct asd_sas_port *port = phy->port;
        struct sas_internal *i =
@@ -67,21 +73,24 @@ static void sas_phye_oob_error(void *data)
                switch (phy->error) {
                case 1:
                case 2:
-                       i->dft->lldd_control_phy(phy, PHY_FUNC_HARD_RESET);
+                       i->dft->lldd_control_phy(phy, PHY_FUNC_HARD_RESET,
+                                                NULL);
                        break;
                case 3:
                default:
                        phy->error = 0;
                        phy->enabled = 0;
-                       i->dft->lldd_control_phy(phy, PHY_FUNC_DISABLE);
+                       i->dft->lldd_control_phy(phy, PHY_FUNC_DISABLE, NULL);
                        break;
                }
        }
 }
 
-static void sas_phye_spinup_hold(void *data)
+static void sas_phye_spinup_hold(struct work_struct *work)
 {
-       struct asd_sas_phy *phy = data;
+       struct asd_sas_event *ev =
+               container_of(work, struct asd_sas_event, work);
+       struct asd_sas_phy *phy = ev->phy;
        struct sas_ha_struct *sas_ha = phy->ha;
        struct sas_internal *i =
                to_sas_internal(sas_ha->core.shost->transportt);
@@ -90,7 +99,7 @@ static void sas_phye_spinup_hold(void *data)
                        &phy->phy_events_pending);
 
        phy->error = 0;
-       i->dft->lldd_control_phy(phy, PHY_FUNC_RELEASE_SPINUP_HOLD);
+       i->dft->lldd_control_phy(phy, PHY_FUNC_RELEASE_SPINUP_HOLD, NULL);
 }
 
 /* ---------- Phy class registration ---------- */
@@ -99,14 +108,14 @@ int sas_register_phys(struct sas_ha_struct *sas_ha)
 {
        int i;
 
-       static void (*sas_phy_event_fns[PHY_NUM_EVENTS])(void *) = {
+       static const work_func_t sas_phy_event_fns[PHY_NUM_EVENTS] = {
                [PHYE_LOSS_OF_SIGNAL] = sas_phye_loss_of_signal,
                [PHYE_OOB_DONE] = sas_phye_oob_done,
                [PHYE_OOB_ERROR] = sas_phye_oob_error,
                [PHYE_SPINUP_HOLD] = sas_phye_spinup_hold,
        };
 
-       static void (*sas_port_event_fns[PORT_NUM_EVENTS])(void *) = {
+       static const work_func_t sas_port_event_fns[PORT_NUM_EVENTS] = {
                [PORTE_BYTES_DMAED] = sas_porte_bytes_dmaed,
                [PORTE_BROADCAST_RCVD] = sas_porte_broadcast_rcvd,
                [PORTE_LINK_RESET_ERR] = sas_porte_link_reset_err,
@@ -121,13 +130,18 @@ int sas_register_phys(struct sas_ha_struct *sas_ha)
 
                phy->error = 0;
                INIT_LIST_HEAD(&phy->port_phy_el);
-               for (k = 0; k < PORT_NUM_EVENTS; k++)
-                       INIT_WORK(&phy->port_events[k], sas_port_event_fns[k],
-                                 phy);
+               for (k = 0; k < PORT_NUM_EVENTS; k++) {
+                       INIT_WORK(&phy->port_events[k].work,
+                                 sas_port_event_fns[k]);
+                       phy->port_events[k].phy = phy;
+               }
+
+               for (k = 0; k < PHY_NUM_EVENTS; k++) {
+                       INIT_WORK(&phy->phy_events[k].work,
+                                 sas_phy_event_fns[k]);
+                       phy->phy_events[k].phy = phy;
+               }
 
-               for (k = 0; k < PHY_NUM_EVENTS; k++)
-                       INIT_WORK(&phy->phy_events[k], sas_phy_event_fns[k],
-                                 phy);
                phy->port = NULL;
                phy->ha = sas_ha;
                spin_lock_init(&phy->frame_rcvd_lock);
@@ -144,10 +158,10 @@ int sas_register_phys(struct sas_ha_struct *sas_ha)
                phy->phy->identify.target_port_protocols = phy->tproto;
                phy->phy->identify.sas_address = SAS_ADDR(sas_ha->sas_addr);
                phy->phy->identify.phy_identifier = i;
-               phy->phy->minimum_linkrate_hw = SAS_LINK_RATE_1_5_GBPS;
-               phy->phy->maximum_linkrate_hw = SAS_LINK_RATE_3_0_GBPS;
-               phy->phy->minimum_linkrate = SAS_LINK_RATE_1_5_GBPS;
-               phy->phy->maximum_linkrate = SAS_LINK_RATE_3_0_GBPS;
+               phy->phy->minimum_linkrate_hw = SAS_LINK_RATE_UNKNOWN;
+               phy->phy->maximum_linkrate_hw = SAS_LINK_RATE_UNKNOWN;
+               phy->phy->minimum_linkrate = SAS_LINK_RATE_UNKNOWN;
+               phy->phy->maximum_linkrate = SAS_LINK_RATE_UNKNOWN;
                phy->phy->negotiated_linkrate = SAS_LINK_RATE_UNKNOWN;
 
                sas_phy_add(phy->phy);