container_of(work, struct sas_discovery_event, work);
        struct asd_sas_port *port = ev->port;
 
-       sas_begin_event(DISCE_DISCOVER_DOMAIN, &port->disc.disc_event_lock,
-                       &port->disc.pending);
+       clear_bit(DISCE_DISCOVER_DOMAIN, &port->disc.pending);
 
        if (port->port_dev)
                return;
                container_of(work, struct sas_discovery_event, work);
        struct asd_sas_port *port = ev->port;
 
-       sas_begin_event(DISCE_REVALIDATE_DOMAIN, &port->disc.disc_event_lock,
-                       &port->disc.pending);
+       clear_bit(DISCE_REVALIDATE_DOMAIN, &port->disc.pending);
 
        SAS_DPRINTK("REVALIDATING DOMAIN on port %d, pid:%d\n", port->id,
                    task_pid_nr(current));
 
        BUG_ON(ev >= DISC_NUM_EVENTS);
 
-       sas_queue_event(ev, &disc->disc_event_lock, &disc->pending,
-                       &disc->disc_work[ev].work, port->ha);
+       sas_queue_event(ev, &disc->pending, &disc->disc_work[ev].work, port->ha);
 
        return 0;
 }
                [DISCE_REVALIDATE_DOMAIN] = sas_revalidate_domain,
        };
 
-       spin_lock_init(&disc->disc_event_lock);
        disc->pending = 0;
        for (i = 0; i < DISC_NUM_EVENTS; i++) {
                INIT_WORK(&disc->disc_work[i].work, sas_event_fns[i]);
 
 {
        BUG_ON(event >= HA_NUM_EVENTS);
 
-       sas_queue_event(event, &sas_ha->event_lock, &sas_ha->pending,
+       sas_queue_event(event, &sas_ha->pending,
                        &sas_ha->ha_events[event].work, sas_ha);
 }
 
 
        BUG_ON(event >= PORT_NUM_EVENTS);
 
-       sas_queue_event(event, &ha->event_lock, &phy->port_events_pending,
+       sas_queue_event(event, &phy->port_events_pending,
                        &phy->port_events[event].work, ha);
 }
 
 
        BUG_ON(event >= PHY_NUM_EVENTS);
 
-       sas_queue_event(event, &ha->event_lock, &phy->phy_events_pending,
+       sas_queue_event(event, &phy->phy_events_pending,
                        &phy->phy_events[event].work, ha);
 }
 
 
        int i;
 
-       spin_lock_init(&sas_ha->event_lock);
-
        for (i = 0; i < HA_NUM_EVENTS; i++) {
                INIT_WORK(&sas_ha->ha_events[i].work, sas_ha_event_fns[i]);
                sas_ha->ha_events[i].ha = sas_ha;
 
                container_of(work, struct sas_ha_event, work);
        struct sas_ha_struct *ha = ev->ha;
 
-       sas_begin_event(HAE_RESET, &ha->event_lock,
-                       &ha->pending);
+       clear_bit(HAE_RESET, &ha->pending);
 }
 
 int sas_register_ha(struct sas_ha_struct *sas_ha)
 
 }
 #endif
 
-static inline void sas_queue_event(int event, spinlock_t *lock,
-                                  unsigned long *pending,
+static inline void sas_queue_event(int event, unsigned long *pending,
                                   struct work_struct *work,
                                   struct sas_ha_struct *sas_ha)
 {
-       unsigned long flags;
+       if (!test_and_set_bit(event, pending)) {
+               unsigned long flags;
 
-       spin_lock_irqsave(lock, flags);
-       if (test_bit(event, pending)) {
-               spin_unlock_irqrestore(lock, flags);
-               return;
+               spin_lock_irqsave(&sas_ha->state_lock, flags);
+               if (sas_ha->state != SAS_HA_UNREGISTERED)
+                       scsi_queue_work(sas_ha->core.shost, work);
+               spin_unlock_irqrestore(&sas_ha->state_lock, flags);
        }
-       __set_bit(event, pending);
-       spin_unlock_irqrestore(lock, flags);
-
-       spin_lock_irqsave(&sas_ha->state_lock, flags);
-       if (sas_ha->state != SAS_HA_UNREGISTERED) {
-               scsi_queue_work(sas_ha->core.shost, work);
-       }
-       spin_unlock_irqrestore(&sas_ha->state_lock, flags);
-}
-
-static inline void sas_begin_event(int event, spinlock_t *lock,
-                                  unsigned long *pending)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(lock, flags);
-       __clear_bit(event, pending);
-       spin_unlock_irqrestore(lock, flags);
 }
 
 static inline void sas_fill_in_rphy(struct domain_device *dev,
 
                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);
+       clear_bit(PHYE_LOSS_OF_SIGNAL, &phy->phy_events_pending);
        phy->error = 0;
        sas_deform_port(phy, 1);
 }
                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);
+       clear_bit(PHYE_OOB_DONE, &phy->phy_events_pending);
        phy->error = 0;
 }
 
        struct sas_internal *i =
                to_sas_internal(sas_ha->core.shost->transportt);
 
-       sas_begin_event(PHYE_OOB_ERROR, &phy->ha->event_lock,
-                       &phy->phy_events_pending);
+       clear_bit(PHYE_OOB_ERROR, &phy->phy_events_pending);
 
        sas_deform_port(phy, 1);
 
        struct sas_internal *i =
                to_sas_internal(sas_ha->core.shost->transportt);
 
-       sas_begin_event(PHYE_SPINUP_HOLD, &phy->ha->event_lock,
-                       &phy->phy_events_pending);
+       clear_bit(PHYE_SPINUP_HOLD, &phy->phy_events_pending);
 
        phy->error = 0;
        i->dft->lldd_control_phy(phy, PHY_FUNC_RELEASE_SPINUP_HOLD, NULL);
 
                container_of(work, struct asd_sas_event, work);
        struct asd_sas_phy *phy = ev->phy;
 
-       sas_begin_event(PORTE_BYTES_DMAED, &phy->ha->event_lock,
-                       &phy->port_events_pending);
+       clear_bit(PORTE_BYTES_DMAED, &phy->port_events_pending);
 
        sas_form_port(phy);
 }
        unsigned long flags;
        u32 prim;
 
-       sas_begin_event(PORTE_BROADCAST_RCVD, &phy->ha->event_lock,
-                       &phy->port_events_pending);
+       clear_bit(PORTE_BROADCAST_RCVD, &phy->port_events_pending);
 
        spin_lock_irqsave(&phy->sas_prim_lock, flags);
        prim = phy->sas_prim;
                container_of(work, struct asd_sas_event, work);
        struct asd_sas_phy *phy = ev->phy;
 
-       sas_begin_event(PORTE_LINK_RESET_ERR, &phy->ha->event_lock,
-                       &phy->port_events_pending);
+       clear_bit(PORTE_LINK_RESET_ERR, &phy->port_events_pending);
 
        sas_deform_port(phy, 1);
 }
                container_of(work, struct asd_sas_event, work);
        struct asd_sas_phy *phy = ev->phy;
 
-       sas_begin_event(PORTE_TIMER_EVENT, &phy->ha->event_lock,
-                       &phy->port_events_pending);
+       clear_bit(PORTE_TIMER_EVENT, &phy->port_events_pending);
 
        sas_deform_port(phy, 1);
 }
                container_of(work, struct asd_sas_event, work);
        struct asd_sas_phy *phy = ev->phy;
 
-       sas_begin_event(PORTE_HARD_RESET, &phy->ha->event_lock,
-                       &phy->port_events_pending);
+       clear_bit(PORTE_HARD_RESET, &phy->port_events_pending);
 
        sas_deform_port(phy, 1);
 }
 
 };
 
 struct sas_discovery {
-       spinlock_t disc_event_lock;
        struct sas_discovery_event disc_work[DISC_NUM_EVENTS];
        unsigned long    pending;
        u8     fanout_sas_addr[8];
  */
 struct asd_sas_phy {
 /* private: */
-       /* protected by ha->event_lock */
        struct asd_sas_event   port_events[PORT_NUM_EVENTS];
        struct asd_sas_event   phy_events[PHY_NUM_EVENTS];
 
 
 struct sas_ha_struct {
 /* private: */
-       spinlock_t       event_lock;
        struct sas_ha_event ha_events[HA_NUM_EVENTS];
        unsigned long    pending;