Commit 71a9f9d2 authored by Arvid Brodin's avatar Arvid Brodin Committed by Greg Kroah-Hartman

usb/isp1760: Improve urb queueing, get rid of BUG():s in normal code paths

This patch replaces the code that handles qtds. Intead of directly allocating
chip mem and chip slot, enqueue the transfer in a list of queue heads. Use
a centralized function enqueue_qtds() to prioritize and enqueue transfers.

This removes all of the interrupt context BUG() calls when out of chip
mem or transfer slots. It also makes it possible to efficiently use the
dual-port mem on the chip for double-buffered transfers, which improve
transfer times to/from/between usb sticks by about 40 % on my HW.

With this patch it should also be possible to handle qtd scheduling outside
of the interrupt handler, for significantly improved kernel latency. I have
not implemented this since there are some locking issues which I haven't
had time to look at.
Signed-off-by: default avatarArvid Brodin <arvid.brodin@enea.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 22bea9ce
This diff is collapsed.
...@@ -104,7 +104,7 @@ struct ptd { ...@@ -104,7 +104,7 @@ struct ptd {
#define ATL_PTD_OFFSET 0x0c00 #define ATL_PTD_OFFSET 0x0c00
#define PAYLOAD_OFFSET 0x1000 #define PAYLOAD_OFFSET 0x1000
struct inter_packet_info { struct slotinfo {
struct isp1760_qh *qh; struct isp1760_qh *qh;
struct isp1760_qtd *qtd; struct isp1760_qtd *qtd;
}; };
...@@ -154,54 +154,52 @@ struct memory_chunk { ...@@ -154,54 +154,52 @@ struct memory_chunk {
/* ATL */ /* ATL */
/* DW0 */ /* DW0 */
#define PTD_VALID 1 #define DW0_VALID_BIT 1
#define PTD_LENGTH(x) (((u32) x) << 3) #define FROM_DW0_VALID(x) ((x) & 0x01)
#define PTD_MAXPACKET(x) (((u32) x) << 18) #define TO_DW0_LENGTH(x) (((u32) x) << 3)
#define PTD_MULTI(x) (((u32) x) << 29) #define TO_DW0_MAXPACKET(x) (((u32) x) << 18)
#define PTD_ENDPOINT(x) (((u32) x) << 31) #define TO_DW0_MULTI(x) (((u32) x) << 29)
#define TO_DW0_ENDPOINT(x) (((u32) x) << 31)
/* DW1 */ /* DW1 */
#define PTD_DEVICE_ADDR(x) (((u32) x) << 3) #define TO_DW1_DEVICE_ADDR(x) (((u32) x) << 3)
#define PTD_PID_TOKEN(x) (((u32) x) << 10) #define TO_DW1_PID_TOKEN(x) (((u32) x) << 10)
#define PTD_TRANS_BULK ((u32) 2 << 12) #define DW1_TRANS_BULK ((u32) 2 << 12)
#define PTD_TRANS_INT ((u32) 3 << 12) #define DW1_TRANS_INT ((u32) 3 << 12)
#define PTD_TRANS_SPLIT ((u32) 1 << 14) #define DW1_TRANS_SPLIT ((u32) 1 << 14)
#define PTD_SE_USB_LOSPEED ((u32) 2 << 16) #define DW1_SE_USB_LOSPEED ((u32) 2 << 16)
#define PTD_PORT_NUM(x) (((u32) x) << 18) #define TO_DW1_PORT_NUM(x) (((u32) x) << 18)
#define PTD_HUB_NUM(x) (((u32) x) << 25) #define TO_DW1_HUB_NUM(x) (((u32) x) << 25)
#define PTD_PING(x) (((u32) x) << 26)
/* DW2 */ /* DW2 */
#define PTD_RL_CNT(x) (((u32) x) << 25) #define TO_DW2_DATA_START_ADDR(x) (((u32) x) << 8)
#define PTD_DATA_START_ADDR(x) (((u32) x) << 8) #define TO_DW2_RL(x) ((x) << 25)
#define BASE_ADDR 0x1000 #define FROM_DW2_RL(x) (((x) >> 25) & 0xf)
/* DW3 */ /* DW3 */
#define PTD_CERR(x) (((u32) x) << 23) #define FROM_DW3_NRBYTESTRANSFERRED(x) ((x) & 0x7fff)
#define PTD_NAC_CNT(x) (((u32) x) << 19) #define FROM_DW3_SCS_NRBYTESTRANSFERRED(x) ((x) & 0x07ff)
#define PTD_ACTIVE ((u32) 1 << 31) #define TO_DW3_NAKCOUNT(x) ((x) << 19)
#define PTD_DATA_TOGGLE(x) (((u32) x) << 25) #define FROM_DW3_NAKCOUNT(x) (((x) >> 19) & 0xf)
#define TO_DW3_CERR(x) ((x) << 23)
#define DW3_HALT_BIT (1 << 30) #define FROM_DW3_CERR(x) (((x) >> 23) & 0x3)
#define TO_DW3_DATA_TOGGLE(x) ((x) << 25)
#define FROM_DW3_DATA_TOGGLE(x) (((x) >> 25) & 0x1)
#define TO_DW3_PING(x) ((x) << 26)
#define FROM_DW3_PING(x) (((x) >> 26) & 0x1)
#define DW3_ERROR_BIT (1 << 28) #define DW3_ERROR_BIT (1 << 28)
#define DW3_QTD_ACTIVE (1 << 31) #define DW3_BABBLE_BIT (1 << 29)
#define DW3_HALT_BIT (1 << 30)
#define DW3_ACTIVE_BIT (1 << 31)
#define INT_UNDERRUN (1 << 2) #define INT_UNDERRUN (1 << 2)
#define INT_BABBLE (1 << 1) #define INT_BABBLE (1 << 1)
#define INT_EXACT (1 << 0) #define INT_EXACT (1 << 0)
#define DW1_GET_PID(x) (((x) >> 10) & 0x3)
#define PTD_XFERRED_LENGTH(x) ((x) & 0x7fff)
#define PTD_XFERRED_LENGTH_LO(x) ((x) & 0x7ff)
#define SETUP_PID (2) #define SETUP_PID (2)
#define IN_PID (1) #define IN_PID (1)
#define OUT_PID (0) #define OUT_PID (0)
#define GET_QTD_TOKEN_TYPE(x) ((x) & 0x3)
#define DATA_TOGGLE (1 << 31)
#define GET_DATA_TOGGLE(x) ((x) >> 31)
/* Errata 1 */ /* Errata 1 */
#define RL_COUNTER (0) #define RL_COUNTER (0)
#define NAK_COUNTER (0) #define NAK_COUNTER (0)
#define ERR_COUNTER (2) #define ERR_COUNTER (2)
#endif #endif /* _ISP1760_HCD_H_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment