1 /* 2 * Serial Attached SCSI (SAS) Event processing 3 * 4 * Copyright (C) 2005 Adaptec, Inc. All rights reserved. 5 * Copyright (C) 2005 Luben Tuikov <luben_tuikov@adaptec.com> 6 * 7 * This file is licensed under GPLv2. 8 * 9 * This program is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU General Public License as 11 * published by the Free Software Foundation; either version 2 of the 12 * License, or (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, but 15 * WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 22 * 23 */ 24 25 #include <scsi/scsi_host.h> 26 #include "sas_internal.h" 27 #include "sas_dump.h" 28 29 static void notify_ha_event(struct sas_ha_struct *sas_ha, enum ha_event event) 30 { 31 BUG_ON(event >= HA_NUM_EVENTS); 32 33 sas_queue_event(event, &sas_ha->event_lock, &sas_ha->pending, 34 &sas_ha->ha_events[event].work, sas_ha); 35 } 36 37 static void notify_port_event(struct asd_sas_phy *phy, enum port_event event) 38 { 39 struct sas_ha_struct *ha = phy->ha; 40 41 BUG_ON(event >= PORT_NUM_EVENTS); 42 43 sas_queue_event(event, &ha->event_lock, &phy->port_events_pending, 44 &phy->port_events[event].work, ha); 45 } 46 47 static void notify_phy_event(struct asd_sas_phy *phy, enum phy_event event) 48 { 49 struct sas_ha_struct *ha = phy->ha; 50 51 BUG_ON(event >= PHY_NUM_EVENTS); 52 53 sas_queue_event(event, &ha->event_lock, &phy->phy_events_pending, 54 &phy->phy_events[event].work, ha); 55 } 56 57 int sas_init_events(struct sas_ha_struct *sas_ha) 58 { 59 static const work_func_t sas_ha_event_fns[HA_NUM_EVENTS] = { 60 [HAE_RESET] = sas_hae_reset, 61 }; 62 63 int i; 64 65 spin_lock_init(&sas_ha->event_lock); 66 67 for (i = 0; i < HA_NUM_EVENTS; i++) { 68 INIT_WORK(&sas_ha->ha_events[i].work, sas_ha_event_fns[i]); 69 sas_ha->ha_events[i].ha = sas_ha; 70 } 71 72 sas_ha->notify_ha_event = notify_ha_event; 73 sas_ha->notify_port_event = notify_port_event; 74 sas_ha->notify_phy_event = notify_phy_event; 75 76 return 0; 77 } 78