X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=drivers%2Fstaging%2Fgreybus%2Fconnection.h;h=4d9f4c64176cb124a6663c37d358058f5383cd18;hb=90579d4b577154606a54cab9771e15a41867b79b;hp=446ffe157a12cdab054061319ad80983fe9dd28e;hpb=4ec1574ae99872a9d1922fb1e57b8d46df4d0920;p=cascardo%2Flinux.git diff --git a/drivers/staging/greybus/connection.h b/drivers/staging/greybus/connection.h index 446ffe157a12..4d9f4c64176c 100644 --- a/drivers/staging/greybus/connection.h +++ b/drivers/staging/greybus/connection.h @@ -13,14 +13,26 @@ #include #include +#define GB_CONNECTION_FLAG_CSD BIT(0) +#define GB_CONNECTION_FLAG_NO_FLOWCTRL BIT(1) +#define GB_CONNECTION_FLAG_OFFLOADED BIT(2) +#define GB_CONNECTION_FLAG_CDSI1 BIT(3) +#define GB_CONNECTION_FLAG_CONTROL BIT(4) +#define GB_CONNECTION_FLAG_HIGH_PRIO BIT(5) + +#define GB_CONNECTION_FLAG_CORE_MASK GB_CONNECTION_FLAG_CONTROL + enum gb_connection_state { - GB_CONNECTION_STATE_INVALID = 0, - GB_CONNECTION_STATE_DISABLED = 1, - GB_CONNECTION_STATE_ENABLED = 2, - GB_CONNECTION_STATE_ERROR = 3, - GB_CONNECTION_STATE_DESTROYING = 4, + GB_CONNECTION_STATE_DISABLED = 0, + GB_CONNECTION_STATE_ENABLED_TX = 1, + GB_CONNECTION_STATE_ENABLED = 2, + GB_CONNECTION_STATE_DISCONNECTING = 3, }; +struct gb_operation; + +typedef int (*gb_request_handler_t)(struct gb_operation *); + struct gb_connection { struct gb_host_device *hd; struct gb_interface *intf; @@ -32,32 +44,34 @@ struct gb_connection { struct list_head hd_links; struct list_head bundle_links; - struct gb_protocol *protocol; - u8 protocol_id; - u8 major; - u8 minor; - u8 module_major; - u8 module_minor; + gb_request_handler_t handler; + unsigned long flags; + struct mutex mutex; spinlock_t lock; enum gb_connection_state state; struct list_head operations; + char name[16]; struct workqueue_struct *wq; atomic_t op_cycle; void *private; -}; -int svc_update_connection(struct gb_interface *intf, - struct gb_connection *connection); + bool mode_switch; +}; struct gb_connection *gb_connection_create_static(struct gb_host_device *hd, - u16 hd_cport_id, u8 protocol_id); -struct gb_connection *gb_connection_create_dynamic(struct gb_interface *intf, - struct gb_bundle *bundle, u16 cport_id, - u8 protocol_id); + u16 hd_cport_id, gb_request_handler_t handler); +struct gb_connection *gb_connection_create_control(struct gb_interface *intf); +struct gb_connection *gb_connection_create(struct gb_bundle *bundle, + u16 cport_id, gb_request_handler_t handler); +struct gb_connection *gb_connection_create_flags(struct gb_bundle *bundle, + u16 cport_id, gb_request_handler_t handler, + unsigned long flags); +struct gb_connection *gb_connection_create_offloaded(struct gb_bundle *bundle, + u16 cport_id, unsigned long flags); void gb_connection_destroy(struct gb_connection *connection); static inline bool gb_connection_is_static(struct gb_connection *connection) @@ -65,12 +79,51 @@ static inline bool gb_connection_is_static(struct gb_connection *connection) return !connection->intf; } +int gb_connection_enable(struct gb_connection *connection); +int gb_connection_enable_tx(struct gb_connection *connection); +void gb_connection_disable_rx(struct gb_connection *connection); +void gb_connection_disable(struct gb_connection *connection); +void gb_connection_disable_forced(struct gb_connection *connection); + +void gb_connection_mode_switch_prepare(struct gb_connection *connection); +void gb_connection_mode_switch_complete(struct gb_connection *connection); + void greybus_data_rcvd(struct gb_host_device *hd, u16 cport_id, u8 *data, size_t length); -int gb_connection_bind_protocol(struct gb_connection *connection); - void gb_connection_latency_tag_enable(struct gb_connection *connection); void gb_connection_latency_tag_disable(struct gb_connection *connection); +static inline bool gb_connection_e2efc_enabled(struct gb_connection *connection) +{ + return !(connection->flags & GB_CONNECTION_FLAG_CSD); +} + +static inline bool +gb_connection_flow_control_disabled(struct gb_connection *connection) +{ + return connection->flags & GB_CONNECTION_FLAG_NO_FLOWCTRL; +} + +static inline bool gb_connection_is_offloaded(struct gb_connection *connection) +{ + return connection->flags & GB_CONNECTION_FLAG_OFFLOADED; +} + +static inline bool gb_connection_is_control(struct gb_connection *connection) +{ + return connection->flags & GB_CONNECTION_FLAG_CONTROL; +} + +static inline void *gb_connection_get_data(struct gb_connection *connection) +{ + return connection->private; +} + +static inline void gb_connection_set_data(struct gb_connection *connection, + void *data) +{ + connection->private = data; +} + #endif /* __CONNECTION_H */