linux/drivers/usb/gadget/legacy/tcm_usb_gadget.h
Linus Torvalds 5c755fe142 Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending
Pull SCSI target updates from Nicholas Bellinger:
 "It's been a busy development cycle for target-core in a number of
  different areas.

  The fabric API usage for se_node_acl allocation is now within
  target-core code, dropping the external API callers for all fabric
  drivers tree-wide.

  There is a new conversion to RCU hlists for se_node_acl and
  se_portal_group LUN mappings, that turns fast-past LUN lookup into a
  completely lockless code-path.  It also removes the original
  hard-coded limitation of 256 LUNs per fabric endpoint.

  The configfs attributes for backends can now be shared between core
  and driver code, allowing existing drivers to use common code while
  still allowing flexibility for new backend provided attributes.

  The highlights include:

   - Merge sbc_verify_dif_* into common code (sagi)
   - Remove iscsi-target support for obsolete IFMarker/OFMarker
     (Christophe Vu-Brugier)
   - Add bidi support in target/user backend (ilias + vangelis + agover)
   - Move se_node_acl allocation into target-core code (hch)
   - Add crc_t10dif_update common helper (akinobu + mkp)
   - Handle target-core odd SGL mapping for data transfer memory
     (akinobu)
   - Move transport ID handling into target-core (hch)
   - Move task tag into struct se_cmd + support 64-bit tags (bart)
   - Convert se_node_acl->device_list[] to RCU hlist (nab + hch +
     paulmck)
   - Convert se_portal_group->tpg_lun_list[] to RCU hlist (nab + hch +
     paulmck)
   - Simplify target backend driver registration (hch)
   - Consolidate + simplify target backend attribute implementations
     (hch + nab)
   - Subsume se_port + t10_alua_tg_pt_gp_member into se_lun (hch)
   - Drop lun_sep_lock for se_lun->lun_se_dev RCU usage (hch + nab)
   - Drop unnecessary core_tpg_register TFO parameter (nab)
   - Use 64-bit LUNs tree-wide (hannes)
   - Drop left-over TARGET_MAX_LUNS_PER_TRANSPORT limit (hannes)"

* 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending: (76 commits)
  target: Bump core version to v5.0
  target: remove target_core_configfs.h
  target: remove unused TARGET_CORE_CONFIG_ROOT define
  target: consolidate version defines
  target: implement WRITE_SAME with UNMAP bit using ->execute_unmap
  target: simplify UNMAP handling
  target: replace se_cmd->execute_rw with a protocol_data field
  target/user: Fix inconsistent kmap_atomic/kunmap_atomic
  target: Send UA when changing LUN inventory
  target: Send UA upon LUN RESET tmr completion
  target: Send UA on ALUA target port group change
  target: Convert se_lun->lun_deve_lock to normal spinlock
  target: use 'se_dev_entry' when allocating UAs
  target: Remove 'ua_nacl' pointer from se_ua structure
  target_core_alua: Correct UA handling when switching states
  xen-scsiback: Fix compile warning for 64-bit LUN
  target: Remove TARGET_MAX_LUNS_PER_TRANSPORT
  target: use 64-bit LUNs
  target: Drop duplicate + unused se_dev_check_wce
  target: Drop unnecessary core_tpg_register TFO parameter
  ...
2015-07-04 14:13:43 -07:00

134 lines
2.7 KiB
C

#ifndef __TARGET_USB_GADGET_H__
#define __TARGET_USB_GADGET_H__
#include <linux/kref.h>
/* #include <linux/usb/uas.h> */
#include <linux/usb/composite.h>
#include <linux/usb/uas.h>
#include <linux/usb/storage.h>
#include <target/target_core_base.h>
#include <target/target_core_fabric.h>
#define USBG_NAMELEN 32
#define fuas_to_gadget(f) (f->function.config->cdev->gadget)
#define UASP_SS_EP_COMP_LOG_STREAMS 4
#define UASP_SS_EP_COMP_NUM_STREAMS (1 << UASP_SS_EP_COMP_LOG_STREAMS)
enum {
USB_G_STR_CONFIG = USB_GADGET_FIRST_AVAIL_IDX,
USB_G_STR_INT_UAS,
USB_G_STR_INT_BBB,
};
#define USB_G_ALT_INT_BBB 0
#define USB_G_ALT_INT_UAS 1
struct tcm_usbg_nexus {
struct se_session *tvn_se_sess;
};
struct usbg_tpg {
struct mutex tpg_mutex;
/* SAS port target portal group tag for TCM */
u16 tport_tpgt;
/* Pointer back to usbg_tport */
struct usbg_tport *tport;
struct workqueue_struct *workqueue;
/* Returned by usbg_make_tpg() */
struct se_portal_group se_tpg;
u32 gadget_connect;
struct tcm_usbg_nexus *tpg_nexus;
atomic_t tpg_port_count;
};
struct usbg_tport {
/* Binary World Wide unique Port Name for SAS Target port */
u64 tport_wwpn;
/* ASCII formatted WWPN for SAS Target port */
char tport_name[USBG_NAMELEN];
/* Returned by usbg_make_tport() */
struct se_wwn tport_wwn;
};
enum uas_state {
UASP_SEND_DATA,
UASP_RECEIVE_DATA,
UASP_SEND_STATUS,
UASP_QUEUE_COMMAND,
};
#define USBG_MAX_CMD 64
struct usbg_cmd {
/* common */
u8 cmd_buf[USBG_MAX_CMD];
u32 data_len;
struct work_struct work;
int unpacked_lun;
struct se_cmd se_cmd;
void *data_buf; /* used if no sg support available */
struct f_uas *fu;
struct completion write_complete;
struct kref ref;
/* UAS only */
u16 tag;
u16 prio_attr;
struct sense_iu sense_iu;
enum uas_state state;
struct uas_stream *stream;
/* BOT only */
__le32 bot_tag;
unsigned int csw_code;
unsigned is_read:1;
};
struct uas_stream {
struct usb_request *req_in;
struct usb_request *req_out;
struct usb_request *req_status;
};
struct usbg_cdb {
struct usb_request *req;
void *buf;
};
struct bot_status {
struct usb_request *req;
struct bulk_cs_wrap csw;
};
struct f_uas {
struct usbg_tpg *tpg;
struct usb_function function;
u16 iface;
u32 flags;
#define USBG_ENABLED (1 << 0)
#define USBG_IS_UAS (1 << 1)
#define USBG_USE_STREAMS (1 << 2)
#define USBG_IS_BOT (1 << 3)
#define USBG_BOT_CMD_PEND (1 << 4)
struct usbg_cdb cmd;
struct usb_ep *ep_in;
struct usb_ep *ep_out;
/* UAS */
struct usb_ep *ep_status;
struct usb_ep *ep_cmd;
struct uas_stream stream[UASP_SS_EP_COMP_NUM_STREAMS];
/* BOT */
struct bot_status bot_status;
struct usb_request *bot_req_in;
struct usb_request *bot_req_out;
};
extern struct usbg_tpg *the_only_tpg_I_currently_have;
#endif