diff options
| author | Jim Harris <jimharris@FreeBSD.org> | 2012-09-26 16:46:44 +0000 |
|---|---|---|
| committer | Jim Harris <jimharris@FreeBSD.org> | 2012-09-26 16:46:44 +0000 |
| commit | 37274fc04c7597c2b05e2296c5d403da48a368bd (patch) | |
| tree | c9480f7a6a6bbb0b5ece741b842edbb984d0b4ae /sys | |
| parent | b04e4c122bad756dc4fa92b36eb8e6366e3d9141 (diff) | |
Notes
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/dev/isci/isci.c | 9 | ||||
| -rw-r--r-- | sys/dev/isci/isci.h | 8 | ||||
| -rw-r--r-- | sys/dev/isci/isci_controller.c | 21 |
3 files changed, 37 insertions, 1 deletions
diff --git a/sys/dev/isci/isci.c b/sys/dev/isci/isci.c index 4d2f4bdf035e..0d4ae4457ab4 100644 --- a/sys/dev/isci/isci.c +++ b/sys/dev/isci/isci.c @@ -38,11 +38,14 @@ __FBSDID("$FreeBSD$"); #include <cam/cam_periph.h> +#include <dev/led/led.h> + #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> #include <dev/isci/scil/scic_logger.h> #include <dev/isci/scil/scic_library.h> +#include <dev/isci/scil/scic_sgpio.h> #include <dev/isci/scil/scic_user_callback.h> #include <dev/isci/scil/scif_controller.h> @@ -180,7 +183,7 @@ static int isci_detach(device_t device) { struct isci_softc *isci = DEVICE2SOFTC(device); - int i; + int i, phy; for (i = 0; i < isci->controller_count; i++) { struct ISCI_CONTROLLER *controller = &isci->controllers[i]; @@ -220,6 +223,10 @@ isci_detach(device_t device) if (controller->remote_device_memory != NULL) free(controller->remote_device_memory, M_ISCI); + for (phy = 0; phy < SCI_MAX_PHYS; phy++) + if (controller->led[phy].cdev) + led_destroy(controller->led[phy].cdev); + while (1) { sci_pool_get(controller->unmap_buffer_pool, unmap_buffer); if (unmap_buffer == NULL) diff --git a/sys/dev/isci/isci.h b/sys/dev/isci/isci.h index 48236b9dca99..006d33a5e6b6 100644 --- a/sys/dev/isci/isci.h +++ b/sys/dev/isci/isci.h @@ -143,6 +143,13 @@ struct ISCI_INTERRUPT_INFO }; +struct ISCI_LED +{ + struct cdev *cdev; + SCI_CONTROLLER_HANDLE_T handle; + int index; +}; + struct ISCI_CONTROLLER { struct isci_softc *isci; @@ -169,6 +176,7 @@ struct ISCI_CONTROLLER uint32_t queue_depth; uint32_t sim_queue_depth; SCI_FAST_LIST_T pending_device_reset_list; + struct ISCI_LED led[SCI_MAX_PHYS]; SCI_MEMORY_DESCRIPTOR_LIST_HANDLE_T mdl; diff --git a/sys/dev/isci/isci_controller.c b/sys/dev/isci/isci_controller.c index 1255201fe835..2b112b22bd17 100644 --- a/sys/dev/isci/isci_controller.c +++ b/sys/dev/isci/isci_controller.c @@ -49,6 +49,9 @@ __FBSDID("$FreeBSD$"); #include <dev/isci/scil/scif_remote_device.h> #include <dev/isci/scil/scif_domain.h> #include <dev/isci/scil/scif_user_callback.h> +#include <dev/isci/scil/scic_sgpio.h> + +#include <dev/led/led.h> void isci_action(struct cam_sim *sim, union ccb *ccb); void isci_poll(struct cam_sim *sim); @@ -271,10 +274,19 @@ void isci_controller_construct(struct ISCI_CONTROLLER *controller, sci_pool_initialize(controller->unmap_buffer_pool); } +static void isci_led_func(void *priv, int onoff) +{ + struct ISCI_LED *led = priv; + + /* map onoff to the locate LED */ + scic_sgpio_update_led_state(led->handle, 1 << led->index, 0, onoff, 0); +} + SCI_STATUS isci_controller_initialize(struct ISCI_CONTROLLER *controller) { SCIC_USER_PARAMETERS_T scic_user_parameters; SCI_CONTROLLER_HANDLE_T scic_controller_handle; + char led_name[64]; unsigned long tunable; int i; @@ -355,6 +367,15 @@ SCI_STATUS isci_controller_initialize(struct ISCI_CONTROLLER *controller) xpt_freeze_simq(controller->sim, 1); mtx_unlock(&controller->lock); + for (i = 0; i < SCI_MAX_PHYS; i++) { + controller->led[i].handle = scic_controller_handle; + controller->led[i].index = i; + sprintf(led_name, "isci.bus%d.port%d.locate", + controller->index, i); + controller->led[i].cdev = led_create(isci_led_func, + &controller->led[i], led_name); + } + return (scif_controller_initialize(controller->scif_controller_handle)); } |
