diff options
Diffstat (limited to 'drivers/scsi/isci/port.h')
-rw-r--r-- | drivers/scsi/isci/port.h | 174 |
1 files changed, 51 insertions, 123 deletions
diff --git a/drivers/scsi/isci/port.h b/drivers/scsi/isci/port.h index b6ce56a6c11..cdea48ece00 100644 --- a/drivers/scsi/isci/port.h +++ b/drivers/scsi/isci/port.h @@ -76,100 +76,19 @@ enum isci_status { }; /** - * struct scic_sds_port - * - * The core port object provides the the abstraction for an SCU port. - */ -struct scic_sds_port { - /** - * This field contains the information for the base port state machine. - */ - struct sci_base_state_machine sm; - - bool ready_exit; - - /** - * This field is the port index that is reported to the SCI USER. - * This allows the actual hardware physical port to change without - * the SCI USER getting a different answer for the get port index. - */ - u8 logical_port_index; - - /** - * This field is the port index used to program the SCU hardware. - */ - u8 physical_port_index; - - /** - * This field contains the active phy mask for the port. - * This mask is used in conjunction with the phy state to determine - * which phy to select for some port operations. - */ - u8 active_phy_mask; - - u16 reserved_rni; - u16 reserved_tag; - - /** - * This field contains the count of the io requests started on this port - * object. It is used to control controller shutdown. - */ - u32 started_request_count; - - /** - * This field contains the number of devices assigned to this port. - * It is used to control port start requests. - */ - u32 assigned_device_count; - - /** - * This field contains the reason for the port not going ready. It is - * assigned in the state handlers and used in the state transition. - */ - u32 not_ready_reason; - - /** - * This field is the table of phys assigned to the port. - */ - struct isci_phy *phy_table[SCI_MAX_PHYS]; - - /** - * This field is a pointer back to the controller that owns this - * port object. - */ - struct scic_sds_controller *owning_controller; - - /* timer used for port start/stop operations */ - struct sci_timer timer; - - /** - * This field is the pointer to the port task scheduler registers - * for the SCU hardware. - */ - struct scu_port_task_scheduler_registers __iomem - *port_task_scheduler_registers; - - /** - * This field is identical for all port objects and points to the port - * task scheduler group PE configuration registers. - * It is used to assign PEs to a port. - */ - u32 __iomem *port_pe_configuration_register; - - /** - * This field is the VIIT register space for ths port object. - */ - struct scu_viit_entry __iomem *viit_registers; -}; - - - -/** - * struct isci_port - This class represents the port object used to internally - * represent libsas port objects. It also keeps a list of remote device - * objects. - * - * + * struct isci_port - isci direct attached sas port object + * @event: counts bcns and port stop events (for bcn filtering) + * @ready_exit: several states constitute 'ready'. When exiting ready we + * need to take extra port-teardown actions that are + * skipped when exiting to another 'ready' state. + * @logical_port_index: software port index + * @physical_port_index: hardware port index + * @active_phy_mask: identifies phy members + * @reserved_tag: + * @reserved_rni: reserver for port task scheduler workaround + * @started_request_count: reference count for outstanding commands + * @not_ready_reason: set during state transitions and notified + * @timer: timeout start/stop operations */ struct isci_port { enum isci_status status; @@ -185,16 +104,25 @@ struct isci_port { struct completion start_complete; struct completion hard_reset_complete; enum sci_status hard_reset_status; - struct scic_sds_port sci; + struct sci_base_state_machine sm; + bool ready_exit; + u8 logical_port_index; + u8 physical_port_index; + u8 active_phy_mask; + u16 reserved_rni; + u16 reserved_tag; + u32 started_request_count; + u32 assigned_device_count; + u32 not_ready_reason; + struct isci_phy *phy_table[SCI_MAX_PHYS]; + struct scic_sds_controller *owning_controller; + struct sci_timer timer; + struct scu_port_task_scheduler_registers __iomem *port_task_scheduler_registers; + /* XXX rework: only one register, no need to replicate per-port */ + u32 __iomem *port_pe_configuration_register; + struct scu_viit_entry __iomem *viit_registers; }; -static inline struct isci_port *sci_port_to_iport(struct scic_sds_port *sci_port) -{ - struct isci_port *iport = container_of(sci_port, typeof(*iport), sci); - - return iport; -} - enum scic_port_not_ready_reason_code { SCIC_PORT_NOT_READY_NO_ACTIVE_PHYS, SCIC_PORT_NOT_READY_HARD_RESET_REQUESTED, @@ -299,90 +227,90 @@ enum scic_sds_port_states { ((this_port)->physical_port_index) -static inline void scic_sds_port_decrement_request_count(struct scic_sds_port *sci_port) +static inline void scic_sds_port_decrement_request_count(struct isci_port *iport) { - if (WARN_ONCE(sci_port->started_request_count == 0, + if (WARN_ONCE(iport->started_request_count == 0, "%s: tried to decrement started_request_count past 0!?", __func__)) /* pass */; else - sci_port->started_request_count--; + iport->started_request_count--; } #define scic_sds_port_active_phy(port, phy) \ (((port)->active_phy_mask & (1 << (phy)->phy_index)) != 0) void scic_sds_port_construct( - struct scic_sds_port *sci_port, + struct isci_port *iport, u8 port_index, struct scic_sds_controller *scic); enum sci_status scic_sds_port_initialize( - struct scic_sds_port *sci_port, + struct isci_port *iport, void __iomem *port_task_scheduler_registers, void __iomem *port_configuration_regsiter, void __iomem *viit_registers); -enum sci_status scic_sds_port_start(struct scic_sds_port *sci_port); -enum sci_status scic_sds_port_stop(struct scic_sds_port *sci_port); +enum sci_status scic_sds_port_start(struct isci_port *iport); +enum sci_status scic_sds_port_stop(struct isci_port *iport); enum sci_status scic_sds_port_add_phy( - struct scic_sds_port *sci_port, + struct isci_port *iport, struct isci_phy *iphy); enum sci_status scic_sds_port_remove_phy( - struct scic_sds_port *sci_port, + struct isci_port *iport, struct isci_phy *iphy); void scic_sds_port_setup_transports( - struct scic_sds_port *sci_port, + struct isci_port *iport, u32 device_id); void isci_port_bcn_enable(struct isci_host *, struct isci_port *); void scic_sds_port_deactivate_phy( - struct scic_sds_port *sci_port, + struct isci_port *iport, struct isci_phy *iphy, bool do_notify_user); bool scic_sds_port_link_detected( - struct scic_sds_port *sci_port, + struct isci_port *iport, struct isci_phy *iphy); -enum sci_status scic_sds_port_link_up(struct scic_sds_port *sci_port, +enum sci_status scic_sds_port_link_up(struct isci_port *iport, struct isci_phy *iphy); -enum sci_status scic_sds_port_link_down(struct scic_sds_port *sci_port, +enum sci_status scic_sds_port_link_down(struct isci_port *iport, struct isci_phy *iphy); struct isci_request; struct scic_sds_remote_device; enum sci_status scic_sds_port_start_io( - struct scic_sds_port *sci_port, + struct isci_port *iport, struct scic_sds_remote_device *sci_dev, struct isci_request *ireq); enum sci_status scic_sds_port_complete_io( - struct scic_sds_port *sci_port, + struct isci_port *iport, struct scic_sds_remote_device *sci_dev, struct isci_request *ireq); enum sas_linkrate scic_sds_port_get_max_allowed_speed( - struct scic_sds_port *sci_port); + struct isci_port *iport); void scic_sds_port_broadcast_change_received( - struct scic_sds_port *sci_port, + struct isci_port *iport, struct isci_phy *iphy); bool scic_sds_port_is_valid_phy_assignment( - struct scic_sds_port *sci_port, + struct isci_port *iport, u32 phy_index); void scic_sds_port_get_sas_address( - struct scic_sds_port *sci_port, + struct isci_port *iport, struct sci_sas_address *sas_address); void scic_sds_port_get_attached_sas_address( - struct scic_sds_port *sci_port, + struct isci_port *iport, struct sci_sas_address *sas_address); enum isci_status isci_port_get_state( |