Merge branch 'master' of git://git.denx.de/u-boot-usb
- r8152, xhci fixes
This commit is contained in:
commit
51f65b506f
3 changed files with 42 additions and 7 deletions
|
@ -447,6 +447,12 @@ static void rtl8152_set_rx_mode(struct r8152 *tp)
|
|||
ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
|
||||
}
|
||||
|
||||
static inline void r8153b_rx_agg_chg_indicate(struct r8152 *tp)
|
||||
{
|
||||
ocp_write_byte(tp, MCU_TYPE_USB, USB_UPT_RXDMA_OWN,
|
||||
OWN_UPDATE | OWN_CLEAR);
|
||||
}
|
||||
|
||||
static int rtl_enable(struct r8152 *tp)
|
||||
{
|
||||
u32 ocp_data;
|
||||
|
@ -457,6 +463,15 @@ static int rtl_enable(struct r8152 *tp)
|
|||
ocp_data |= PLA_CR_RE | PLA_CR_TE;
|
||||
ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, ocp_data);
|
||||
|
||||
switch (tp->version) {
|
||||
case RTL_VER_08:
|
||||
case RTL_VER_09:
|
||||
r8153b_rx_agg_chg_indicate(tp);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
rxdy_gated_en(tp, false);
|
||||
|
||||
rtl8152_set_rx_mode(tp);
|
||||
|
@ -525,8 +540,6 @@ static void r8153_set_rx_early_size(struct r8152 *tp)
|
|||
debug("** %s Invalid Device\n", __func__);
|
||||
break;
|
||||
}
|
||||
|
||||
ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_SIZE, ocp_data);
|
||||
}
|
||||
|
||||
static int rtl8153_enable(struct r8152 *tp)
|
||||
|
@ -1647,7 +1660,7 @@ int r8152_eth_probe(struct usb_device *dev, unsigned int ifnum,
|
|||
if (usb_set_interface(dev, iface_desc->bInterfaceNumber, 0) ||
|
||||
!ss->ep_in || !ss->ep_out || !ss->ep_int) {
|
||||
debug("Problems with device\n");
|
||||
return 0;
|
||||
goto error;
|
||||
}
|
||||
|
||||
dev->privptr = (void *)ss;
|
||||
|
@ -1659,7 +1672,7 @@ int r8152_eth_probe(struct usb_device *dev, unsigned int ifnum,
|
|||
r8152b_get_version(tp);
|
||||
|
||||
if (rtl_ops_init(tp))
|
||||
return 0;
|
||||
goto error;
|
||||
|
||||
tp->rtl_ops.init(tp);
|
||||
tp->rtl_ops.up(tp);
|
||||
|
@ -1669,6 +1682,11 @@ int r8152_eth_probe(struct usb_device *dev, unsigned int ifnum,
|
|||
DUPLEX_FULL);
|
||||
|
||||
return 1;
|
||||
|
||||
error:
|
||||
cfree(ss->dev_priv);
|
||||
ss->dev_priv = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int r8152_eth_get_info(struct usb_device *dev, struct ueth_data *ss,
|
||||
|
|
|
@ -92,6 +92,7 @@
|
|||
#define USB_PM_CTRL_STATUS 0xd432 /* RTL8153A */
|
||||
#define USB_RX_EXTRA_AGGR_TMR 0xd432 /* RTL8153B */
|
||||
#define USB_TX_DMA 0xd434
|
||||
#define USB_UPT_RXDMA_OWN 0xd437
|
||||
#define USB_TOLERANCE 0xd490
|
||||
#define USB_LPM_CTRL 0xd41a
|
||||
#define USB_BMU_RESET 0xd4b0
|
||||
|
@ -346,6 +347,10 @@
|
|||
#define BMU_RESET_EP_IN 0x01
|
||||
#define BMU_RESET_EP_OUT 0x02
|
||||
|
||||
/* USB_UPT_RXDMA_OWN */
|
||||
#define OWN_UPDATE BIT(0)
|
||||
#define OWN_CLEAR BIT(1)
|
||||
|
||||
/* USB_UPS_CTRL */
|
||||
#define POWER_CUT 0x0100
|
||||
|
||||
|
|
|
@ -580,10 +580,13 @@ int xhci_bulk_tx(struct usb_device *udev, unsigned long pipe,
|
|||
int ret;
|
||||
u32 trb_fields[4];
|
||||
u64 val_64 = virt_to_phys(buffer);
|
||||
void *last_transfer_trb_addr;
|
||||
int available_length;
|
||||
|
||||
debug("dev=%p, pipe=%lx, buffer=%p, length=%d\n",
|
||||
udev, pipe, buffer, length);
|
||||
|
||||
available_length = length;
|
||||
ep_index = usb_pipe_ep_index(pipe);
|
||||
virt_dev = ctrl->devs[slot_id];
|
||||
|
||||
|
@ -697,7 +700,7 @@ int xhci_bulk_tx(struct usb_device *udev, unsigned long pipe,
|
|||
trb_fields[2] = length_field;
|
||||
trb_fields[3] = field | TRB_TYPE(TRB_NORMAL);
|
||||
|
||||
queue_trb(ctrl, ring, (num_trbs > 1), trb_fields);
|
||||
last_transfer_trb_addr = queue_trb(ctrl, ring, (num_trbs > 1), trb_fields);
|
||||
|
||||
--num_trbs;
|
||||
|
||||
|
@ -710,6 +713,7 @@ int xhci_bulk_tx(struct usb_device *udev, unsigned long pipe,
|
|||
|
||||
giveback_first_trb(udev, ep_index, start_cycle, start_trb);
|
||||
|
||||
again:
|
||||
event = xhci_wait_for_event(ctrl, TRB_TRANSFER);
|
||||
if (!event) {
|
||||
debug("XHCI bulk transfer timed out, aborting...\n");
|
||||
|
@ -718,12 +722,20 @@ int xhci_bulk_tx(struct usb_device *udev, unsigned long pipe,
|
|||
udev->act_len = 0;
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
field = le32_to_cpu(event->trans_event.flags);
|
||||
|
||||
if ((uintptr_t)(le64_to_cpu(event->trans_event.buffer))
|
||||
!= (uintptr_t)last_transfer_trb_addr) {
|
||||
available_length -=
|
||||
(int)EVENT_TRB_LEN(le32_to_cpu(event->trans_event.transfer_len));
|
||||
xhci_acknowledge_event(ctrl);
|
||||
goto again;
|
||||
}
|
||||
|
||||
field = le32_to_cpu(event->trans_event.flags);
|
||||
BUG_ON(TRB_TO_SLOT_ID(field) != slot_id);
|
||||
BUG_ON(TRB_TO_EP_INDEX(field) != ep_index);
|
||||
|
||||
record_transfer_result(udev, event, length);
|
||||
record_transfer_result(udev, event, available_length);
|
||||
xhci_acknowledge_event(ctrl);
|
||||
xhci_inval_cache((uintptr_t)buffer, length);
|
||||
|
||||
|
|
Loading…
Reference in a new issue