Use correct length mask for split transactions. The hardware would

sometimes put non-zero values in the upper length bits, which are
available for high-speed-only USB transactions, breaking the reception
of data.
This commit is contained in:
hselasky 2014-11-22 08:47:04 +00:00
parent 9d80959c81
commit 0f5e2dce4f
2 changed files with 14 additions and 4 deletions

View File

@ -510,7 +510,10 @@ saf1761_host_bulk_data_rx(struct saf1761_otg_softc *sc, struct saf1761_otg_td *t
td->error_any = 1;
goto complete;
}
count = (status & SOTG_PTD_DW3_XFER_COUNT);
if (td->dw1_value & SOTG_PTD_DW1_ENABLE_SPLIT)
count = (status & SOTG_PTD_DW3_XFER_COUNT_SPLIT);
else
count = (status & SOTG_PTD_DW3_XFER_COUNT_HS);
got_short = 0;
/* verify the packet byte count */
@ -700,7 +703,10 @@ saf1761_host_intr_data_rx(struct saf1761_otg_softc *sc, struct saf1761_otg_td *t
td->error_any = 1;
goto complete;
}
count = (status & SOTG_PTD_DW3_XFER_COUNT);
if (td->dw1_value & SOTG_PTD_DW1_ENABLE_SPLIT)
count = (status & SOTG_PTD_DW3_XFER_COUNT_SPLIT);
else
count = (status & SOTG_PTD_DW3_XFER_COUNT_HS);
got_short = 0;
/* verify the packet byte count */
@ -895,7 +901,10 @@ saf1761_host_isoc_data_rx(struct saf1761_otg_softc *sc, struct saf1761_otg_td *t
} else if (status & SOTG_PTD_DW3_HALTED) {
goto complete;
}
count = (status & SOTG_PTD_DW3_XFER_COUNT);
if (td->dw1_value & SOTG_PTD_DW1_ENABLE_SPLIT)
count = (status & SOTG_PTD_DW3_XFER_COUNT_SPLIT);
else
count = (status & SOTG_PTD_DW3_XFER_COUNT_HS);
/* verify the packet byte count */
if (count != td->max_packet_size) {

View File

@ -211,7 +211,8 @@
#define SOTG_PTD_DW3_CERR_3 (3U << 23)
#define SOTG_PTD_DW3_CERR_2 (2U << 23) /* infinite NAKs */
#define SOTG_PTD_DW3_CERR_1 (1U << 23)
#define SOTG_PTD_DW3_XFER_COUNT 0x7FFF
#define SOTG_PTD_DW3_XFER_COUNT_HS 0x7FFF
#define SOTG_PTD_DW3_XFER_COUNT_SPLIT 0x03FF
#define SOTG_PTD_DW4 16
#define SOTG_PTD_DW5 20
#define SOTG_PTD_DW6 24