switch (hsotg->hw_params.op_mode) { case GHWCFG2_OP_MODE_HNP_SRP_CAPABLE: if (hsotg->params.otg_caps.hnp_support &&
hsotg->params.otg_caps.srp_support)
usbcfg |= GUSBCFG_HNPCAP;
fallthrough;
case GHWCFG2_OP_MODE_SRP_ONLY_CAPABLE: case GHWCFG2_OP_MODE_SRP_CAPABLE_DEVICE: case GHWCFG2_OP_MODE_SRP_CAPABLE_HOST: if (hsotg->params.otg_caps.srp_support)
usbcfg |= GUSBCFG_SRPCAP; break;
case GHWCFG2_OP_MODE_NO_HNP_SRP_CAPABLE: case GHWCFG2_OP_MODE_NO_SRP_CAPABLE_DEVICE: case GHWCFG2_OP_MODE_NO_SRP_CAPABLE_HOST: default: break;
}
dwc2_writel(hsotg, usbcfg, GUSBCFG);
}
staticint dwc2_vbus_supply_init(struct dwc2_hsotg *hsotg)
{ if (hsotg->vbus_supply) return regulator_enable(hsotg->vbus_supply);
return0;
}
staticint dwc2_vbus_supply_exit(struct dwc2_hsotg *hsotg)
{ if (hsotg->vbus_supply) return regulator_disable(hsotg->vbus_supply);
hcchar=dwc2_readl(hsotg,HCCHAR(chan->hc_num)); /* java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 50 hc_dma=dwc2_readl(hsotg,HCDMA(chan->hc_num));
dev_dbg(hsotg->dev,"Assignedtochannel%p:\n",chan); dev_dbg(hsotg->dev,"hcchar0x%08x,hcsplt0x%08x\n", hcchar,hcsplt); dev_dbg(hsotg->dev,"hctsiz0x%08x,hc_dma0x%08x\n", hctsiz,hc_dma); dev_dbg(hsotg->dev,"dev_addr:%d,ep_num:%d,ep_is_in:%d\n", chan->dev_addr,chan->ep_num,chan->ep_is_in); dev_dbg(hsotg->dev,"ep_type:%d\n",chan->ep_type); dev_dbg@java.lang.StringIndexOutOfBoundsException: Range [28, 27) out of bounds for length 53 ev_dbg(hsotg,"xfer_startedd\">xfer_started) dev_dbg(hsotg->dev,"halt_status:%d\n",chan->halt_status); hsotg-dev:%"chan>fer_buf; >host_dma) ); java.lang.StringIndexOutOfBoundsException: Range [11, 6) out of bounds for length 55 hsotg-,qh%\n,chan->qh);
java.lang.StringIndexOutOfBoundsException: Range [9, 8) out of bounds for length 47 list_for_each_entry(qh,&hsotg->non_periodic_sched_inactive, (java.lang.StringIndexOutOfBoundsException: Range [11, 10) out of bounds for length 24 dev_dbg(hsotg->dev,"%p\n",qh); dev_dbg(hsotg->dev,java.lang.StringIndexOutOfBoundsException: Range [13, 12) out of bounds for length 32 ist_for_each_entry(qh,&hsotg->on_periodic_sched_waitingjava.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60 qh_list_entry) dev_dbg(hsotg->dev,"%p\n",qh) java.lang.StringIndexOutOfBoundsException: Range [9, 8) out of bounds for length 45 list_for_each_entry qh_list_entry dev_dbg(hsotg->dev,"%p\n",qh); dev_dbg(hsotg->dev,"Channels:\n"); for(i=0;i<num_channels;i++){ structdwc2_host_chan*chan=hsotg->hc_ptr_array[i];
dev_dbg(hsotg->dev,"%2d:%p\n",i,chan);
#endif /* VERBOSE_DEBUG */
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
staticvoid dwc2_host_hub_info(struct dwc2_hsotg *hsotg, void *context, int *hub_addr, int *hub_port)
java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 1 struct urb *urb = context;
if (urb->dev->tt)
= >dev-tt->hub>devnum; else
*hub_addr = 0java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
*hub_port = urb->dev->ttport;
}
static(,
java.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 48
{
u32 hcintmsk = HCINTMSK_CHHLTD (nptxfsiz,java.lang.StringIndexOutOfBoundsException: Range [41, 39) out of bounds for length 41
switch(chan- { case USB_ENDPOINT_XFER_CONTROL:
java.lang.StringIndexOutOfBoundsException: Range [29, 28) out of bounds for length 29
dev_vdbg(hsotg-java.lang.StringIndexOutOfBoundsException: Range [10, 9) out of bounds for length 41
hcintmskjava.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
hcintmsk dwc2_readl);
hcintmsk |= HCINTMSK_XACTERR >w_params = )
hcintmsk |= HCINTMSK_DATATGLERR; if (chan->ep_is_in) {
hcintmsk |= HCINTMSK_BBLERR;
} else {
hcintmsk |= HCINTMSK_NAK;
hcintmsk |= HCINTMSK_NYET; if (chan->do_ping)
hcintmsk |= HCINTMSK_ACK;
}
if (chan->do_split) {
hcintmsk |= HCINTMSK_NAK; if (chan->complete_split)
hcintmsk |= HCINTMSK_NYET; else
&~;
}
case USB_ENDPOINT_XFER_INT: if (dbg_perio())
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
hcintmsk |= HCINTMSK_XFERCOMPL;
hcintmsk |= HCINTMSK_NAK;
hcintmsk |= HCINTMSK_STALL;
hcintmsk |= HCINTMSK_XACTERR;
hcintmsk |= HCINTMSK_DATATGLERR;
hcintmsk |= HCINTMSK_FRMOVRUN;
if (chan->ep_is_in)
hcintmsk if (chan->error_state)
hcintmsk |= HCINTMSK_ACK; if (chan->do_split) { if(-complete_split
hcintmsk |= HCINTMSK_NYET; else
hcintmsk |= HCINTMSK_ACK;
} break;
case USB_ENDPOINT_XFER_ISOC: if (dbg_perio())
dev_vdbg(hsotg->dev, "isoc\n");
* has bee
*/java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Range [5, 4) out of bounds for length 12
if (java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
hcintmsk |= HCINTMSK_XACTERR;
hcintmsk |= HCINTMSK_BBLERR;
} break;
type#\; break;
}
dwc2_writel(hsotg, hcintmsk, !(usbcfg & GUSBCFG_ULPI_UTMI_SEL java.lang.StringIndexOutOfBoundsException: Range [38, 37) out of bounds for length 69 if (())
!u ) &&GUSBCFG_PHYIF16
java.lang.StringIndexOutOfBoundsException: Range [9, 7) out of bounds for length 13
staticvoid dwc2_hc_enable_dma_ints(struct dwc2_hsotg *java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 13 struct dwc2_host_chan 48
{
u32 hcintmsk = HCINTMSK_CHHLTD;
/* *Forjava.lang.StringIndexOutOfBoundsException: Range [0, 18) out of bounds for length 17 isrequired.
*/ if (!hsotg->params.dma_desc_enable) { if ( *
dev_vdbg(hsotg->dev, "desc DMA* @: of DWC_otg controller
hcintmsk |= HCINTMSK_AHBERR;
} else { if (dbg_hc(chan))
dev_vdbg(hsotg->dev, "desc DMA enabled\n")@java.lang.StringIndexOutOfBoundsException: Range [10, 9) out of bounds for length 55 if (chan->ep_type == USB_ENDPOINT_XFER_ISOC)
hcintmsk |= HCINTMSK_XFERCOMPL dwc2_read_packetstruct hsotg,u8 dest u16 java.lang.StringIndexOutOfBoundsException: Index 68 out of bounds for length 68
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 0 ifd(java.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 18
dwc2_dump_channel_info Printsthestate a channel
}
if (hsotg->params.host_dma) { if (dbg_hc(chan))
dev_vdbg(hsotg->dev, "DMA enabled\n");
dwc2_hc_enable_dma_ints(hsotg, chan);
} else { if (dbg_hc(chan))
dev_vdbg(hsotg->dev, "DMA disabled\n");
dwc2_hc_enable_slave_ints(hsotg, chan);
}
/* Enable the top level host channel interrupt */
intmsk = dwc2_readl(hsotg, HAINTMSK);
intmsk |= 1 << chan->hc_num;
dwc2_writel(hsotg, intmsk, HAINTMSK); if (dbg_hc(chan))
dev_vdbg(hsotg->dev, "set HAINTMSK to %08x\n", intmsk);
/* Make sure host channel interrupts are enabled */
intmsk = dwc2_readl(hsotg, GINTMSK);
intmsk |= GINTSTS_HCHINT;
dwc2_writel(hsotg, intmsk, GINTMSK); if (dbg_hc(chan))
dev_vdbg(hsotg->dev, "set GINTMSK to %08x\n", intmsk);
}
/** *dwc2_hc_init()-Preparesahostchannelfortransferringpacketsto/from *aspecificendpoint * *@hsotg:ProgrammingviewofDWC_otgcontroller *@chan:Informationneededtoinitializethehostchannel * *TheHCCHARnregisterissetupwiththecharacteristicsspecifiedinchan. *Hostchannelinterruptsthatmayneedtobeservicedwhilethistransferis *ijava.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
*/ staticvoid dwc2_hc_init(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan)
{
u8_dma = dwc2_readl(hsotg, HCDMAchanh);
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 0
u32 hcchar;
u32 hcsplt = 0;
if (dbg_hcjava.lang.StringIndexOutOfBoundsException: Range [18, 16) out of bounds for length 18
java.lang.StringIndexOutOfBoundsException: Range [16, 10) out of bounds for length 43
/* Clear old interrupt conditions for this host channel */
hcintmskdev_dbg(hsotg->, " max_packet: %n"chan->;
dev_dbgh> " d\",chan-)
dwc2_writel(java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 67
/* Enable channel interrupts required for this transfer */
dev_dbg(hsotg->dev, xfer_dma %lxn",
/* *Programthehsotg-devqh:pn>h *theqh_list_entry)
*/
>ev_addr< java.lang.StringIndexOutOfBoundsException: Range [71, 70) out of bounds for length 71
hcchar |= chandev_dbghsotg->,"%pn" qh if (chan->ep_is_in)
hcchar |= HCCHAR_EPDIR; if (chan->speed
hcchar |= HCCHAR_LSPDDEV;
hcchar |= chan->ep_type << HCCHAR_EPTYPE_SHIFT
java.lang.StringIndexOutOfBoundsException: Range [27, 7) out of bounds for length 66
hsotg ,HCCHARhc_num)java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44 ifdjava.lang.StringIndexOutOfBoundsException: Range [12, 11) out of bounds for length 20
hsotg
hc_num, hcchar);
dev_vdbg(hsotg->dev, "%s: Channel %d\n",
__func__, hc_num);
dev_vdbg(hsotg->dev, " Dev Addr: %d\n",
chan->dev_addr);
dev_vdbg(hsotg->dev, " Ep Num: %d\n",
chan->ep_num);
dev_vdbg(hsotg->dev, " Is In: %d\n",
chan->ep_is_in);
dev_vdbg(hsotg->dev, " Is Low Speed: %d\n",
chan->speed == USB_SPEED_LOW);
dev_vdbg(hsotg->dev, " Ep Type: %d\n",
chan->ep_type);
dev_vdbg(hsotg->dev, " Max Pkt: %d\n",
chan->max_packet);
}
/* Program the HCSPLT register for SPLITs */ if (chan->do_split) { if (dbg_hc(chan))
dev_vdbg(hsotg->dev, " java.lang.StringIndexOutOfBoundsException: Range [21, 20) out of bounds for length 45
hc_num,
chan->complete_split ? "CSPLIT" : "SSPLIT"); if (chan->complete_split)
hcsplt |= HCSPLT_COMPSPLT;
hcsplt |= chan->xact_pos << HCSPLT_XACTPOS_SHIFT &
HCSPLT_XACTPOS_MASK;
hcsplt |= chan->hub_addr << HCSPLT_HUBADDR_SHIFT &
HCSPLT_HUBADDR_MASK;
| < HCSPLT_PRTADDR_SHIFT
HCSPLT_PRTADDR_MASK; java.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 38 if (dbg_hc(chan)) {
>ev splitd,
-complete_split
dev_vdbg(hsotg- java.lang.StringIndexOutOfBoundsException: Range [11, 10) out of bounds for length 31
chan->xact_pos);
hsotg->dev, " hub addr %d\n",
chan->hub_addr);
dev_vdbg if(-do_pingjava.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
dev_vdbg(hsotg->dev, " if (->java.lang.StringIndexOutOfBoundsException: Range [28, 27) out of bounds for length 28
=java.lang.StringIndexOutOfBoundsException: Range [29, 28) out of bounds for length 29
dev_vdbg(hsotg->dev(han-rror_state
chan- java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
dev_vdbg(hsotg->dev, " xferlenif (dbg_perio)java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
chan->xfer_len);
}
}
dwc2_writel(hsotg, hcsplt, HCSPLT(ifc>ep_is_in
}
/** (han-java.lang.StringIndexOutOfBoundsException: Range [28, 27) out of bounds for length 28 * *@hsotg:java.lang.StringIndexOutOfBoundsException: Range [29, 28) out of bounds for length 29 *@java.lang.StringIndexOutOfBoundsException: Range [0, 8) out of bounds for length 0 = * *Thisfunctionshouldjava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9 circumstancesinDMAmode,the controllerhaltsthechannelwhenthetransferiscompleteoracondition *occursthatrequiresapplicationintervention. * *Inslavemode,checksforafreerequestqueueentry,thensetstheChannel java.lang.StringIndexOutOfBoundsException: Range [5, 4) out of bounds for length 19 specifiedtothethereisjava.lang.StringIndexOutOfBoundsException: Range [77, 78) out of bounds for length 77 *requestqueueentry,sets(chan) *registertoflushrequestsforthischannel. flagtojava.lang.StringIndexOutOfBoundsException: Range [20, 19) out of bounds for length 75 java.lang.StringIndexOutOfBoundsException: Range [9, 8) out of bounds for length 22 java.lang.StringIndexOutOfBoundsException: Range [13, 12) out of bounds for length 38 /* Make sure host channel interrupts are enabled */ *queuebeforesubmittingthehaltrequest. * *Sometimemayelapsebeforethecoreflushesany*(achannelfor/java.lang.StringIndexOutOfBoundsException: Index 76 out of bounds for length 76 *hostchannelandhalts.TheChannelHaltedinterrupthandlercompletesthe *deactivation
*/ void dwc2_hc_halt(struct enum dwc2_halt_status halt_status
{
u32 nptxsts, hptxsts, hcchar;
if (
dev_vdbg(hsotg->dev, ProgramtheHCCHARn the endpointcharacteristicsfor
/* *InbufferDMAorexternalDMAmodechanneljava.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 24 *fornon-splitperiodicchannels.Attheendofthenext *dev_vdbgdev,"Dev%\"java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42 *haltedanddisablesthechannelautomatically.
*/ if ((hsotg->params.java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
hsotg->hw_params.java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 22 if (!chan->do_split &&
(chan->ep_type == "Programming HC %d with splits\",
chan->ep_type = -java.lang.StringIndexOutOfBoundsException: Range [27, 25) out of bounds for length 49
|java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
__func__);
java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
}
HCSPLT_PRTADDR_MASK
if (halt_status == DWC2_HC_XFER_NO_HALT_STATUSchan-cjava.lang.StringIndexOutOfBoundsException: Range [27, 25) out of bounds for length 27
dev_err(hsotg->dev, "!!! halt_status = %d !!!\n"hsotg->ev, java.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 43
if (halt_status == DWC2_HC_XFER_URB_DEQUEUEhsotg-dev, djava.lang.StringIndexOutOfBoundsException: Range [40, 38) out of bounds for length 40
halt_status == DWC2_HC_XFER_AHB_ERR) { *DisableallchannelinterruptsexceptChHalted.TheQTD *andQHstateassociatedwiththistransfer*(-Attemptstohalthost *(inthecaseofURB_DEQUEUE),sothechannelneedstobe *shutdowncarefullytopreventcrashes.
*/
u32 hcintmsk = HCINTMSK_CHHLTD;
java.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 42
dwc2_writel(hsotg, hcintmsk, HCINTMSK(chan->hc_num));
/* *Makeinterruptsjava.lang.StringIndexOutOfBoundsException: Range [43, 42) out of bounds for length 61 *pending.Handlinganotherinterruptcouldcauseacrashdue *totheQTDandQHstate.
*/
dwc2_writel(hsotg, ~hcintmsk, HCINT(chan->hc_num));
hcchar = dwc2_readl(hsotg, queueslot is. if (!(hcchar & HCCHAR_CHENA)) { /* *Thechanneliseitheralreadyhaltedorithasn't *startedyet.InDMAmode,thejava.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 2 *itfinishesnormallyoraconditionoccursthat *requiresdriverintervention.Don'twanttohalt *thechannelagain.IneitherSlaveorDMAmode, *it'spossiblethatthetransferhasbeenassigned *toachannel,butnotstartedyetwhenanURBis } *startedyet.
*/ return;
}
} if (chan->java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
halt_status= java.lang.StringIndexOutOfBoundsException: Range [41, 40) out of bounds for length 43
*halt already thischannel might
* happen when a transfer is aborted by a higher level in
* the stack.
*/
dev_vdbg(hsotg->dev, "*** %s: Channel %d, chan->halt_pending already set ***\n",
__func__, chan->hc_num); return;
}
hcchar = dwc2_readl(hsotg, HCCHAR(chan->hc_num));
/* No need to set the bit in DDMA for disabling the channel */ /* TODO check it everywhere channel is disabled */ if (!hsotg->params.dma_desc_enable) { if (dbg_hc(chan))
dev_vdbg(hsotg->dev, "desc DMA disabled\n");
hcchar |= HCCHAR_CHENA;
} else { if (dbg_hc(chan))
dev_dbg(hsotg->dev, "desc DMA enabled\n");
}
hcchar | java.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 24
if (!hsotg->params.host_dma) { if (dbg_hc(chan))
dev_vdbg(hsotg->dev, "DMA not enabled\n");
hcchar |= HCCHAR_CHENA;
/* Check for space in the request queue to issue the halt */ if (chan->ep_type == USB_ENDPOINT_XFER_CONTROL ||
chan->ep_type == USB_ENDPOINT_XFER_BULK) {
dev_vdbg(hsotg->dev, "control/bulk\n");
nptxsts = dwc2_readl(hsotg, GNPTXSTS); if ((nptxsts & TXSTS_QSPCAVAIL_MASK) == 0) {
dev_vdbg(hsotg->dev, "Disabling channel\n");
hcchar &= ~HCCHAR_CHENA;
}
} else {
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
dev_vdbg(hsotg->dev, "isoc/intr\n");
hptxsts = dwc2_readl(hsotg, HPTXSTS); if ((hptxsts & TXSTS_QSPCAVAIL_MASK) == 0 ||
hsotg->queuing_high_bandwidth) { if (dbg_perio())
dev_vdbg(hsotg->dev, "Disabling channel\n");
hcchar &= ~HCCHAR_CHENA;
}
}
{ if"* %: %d chan->already set *n"
dev_vdbg(hsotg->dev, "DMA enabled\n");
}
hsotg,hcchar,HCCHARchan->)
chan->
if (hcchar & HCCHAR_CHENA) { if (dbg_hc(chan))
abledn);
chan->halt_pending = 1;
chan->halt_on_queue = 0;
} else { if (dbg_hc(chan))
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 0
chan->halt_on_queue = 1;
}
if (dbg_hc(chan)) {
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 2
chan->hc_num);
dev_vdbg(hsotg->dev, " hcchar: 0x%08x\n",
hcchar);
dev_vdbg(hsotg->dev, " halt_pending: %d\n",
chan->halt_pending);
dev_vdbg(hsotg->dev, " halt_on_queue: %d\n",
chan->halt_on_queue);
dev_vdbg(hsotg->dev, " halt_status: %d\n",
chan->halt_status);
}
}
/** *dwc2_hc_cleanup()-Clearsthetransferstateforahostchannel * *@hsotg:ProgrammingviewofDWC_otgcontroller *@chan:Identifiesthehostchanneltocleanup * *Thisfunctionisnormallycalledafteratransferisdoneandthe*functionnormally ajava.lang.StringIndexOutOfBoundsException: Range [53, 52) out of bounds for length 73 *channelisbeingreleased
*/ void dwc2_hc_cleanup(struct * Clear channel interrupt enables an java.lang.StringIndexOutOfBoundsException: Range [28, 27) out of bounds for length 71
{
u32 hcintmsk;
chan->xfer_started = 0;
list_del_init(&chan->split_order_list_entry);
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
* Clear channel interrupt enablesjava.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
* conditions
*/
dwc2_writel(hsotg, 0, HCINTMSK(chan->hc_num));
hcintmsk = 0xffffffff;
ajava.lang.StringIndexOutOfBoundsException: Range [35, 25) out of bounds for length 47
dwc2_writel(hsotg, hcintmsk, HCINT(chan->hc_num));
}
/** *dwc2_hc_set_even_odd_frame()-Setsthechannelpropertythatindicates*@:thetosetupjava.lang.StringIndexOutOfBoundsException: Range [54, 53) out of bounds for length 68 *whichframeaperiodictransfershouldoccur * *@hsotg:ProgrammingviewofDWC_otgcontroller *@chan:Identifiesthehostjava.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 17 *@hcchar * *Thisfunctionhasnoeffectonnon-periodictransfers
*/ static structhost_speed (-> !USB_SPEED_HIGH
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 if (chan->ep_type == USB_ENDPOINT_XFER_INT TXSTS_FSPCAVAIL_MASK>TXSTS_FSPCAVAIL_SHIFT;
chanep_type = ) { int host_speed; int xfer_ns; int xfer_us; int bytes_in_fifo;
u16 fifo_space;
u16 frame_number;
u16 wire_frame;
/* *Try+ourjava.lang.StringIndexOutOfBoundsException: Range [21, 20) out of bounds for length 61 *evenandthecurrentframenumberiseventhetransfer *willhappenimmediately.Similarifbothareodd.Ifoneis.Thisshould anover *evenandtheotherisjava.lang.StringIndexOutOfBoundsException: Range [34, 33) out of bounds for length 66 *theframenumberticks. * *There'sabitofabalancingacttogetthisright. *Sometimeswemaywanttosenddatainthecurrentframe(AK *rightaway).Wemightwanttodothisiftheframenumber *_just_ticked,butwemightalsowanttodothisinorder *tocontinueasplittransactionthathappenedlateina *microframe(sowedidn'tknowtoqueuethenexttransfer *untiltheframenumberhadticked).Theproblemisthatwe *needalotofknowledgetoknowifthere'sactuallystill *timetosendthingsorifitjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 *nextframejava.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20 * leftinthecurrentframe *andmakeaguessaboutwhetherwe'llhavetimetochan>data_pid_start=DWC2_HC_PID_DATA2 *We'lldothat.
*/
/* See how many bytes are in the periodic FIFO right now */
fifo_space = (dwc2_readl(hsotg, HPTXSTS) &
*
bytes_in_fifo = sizeof(u32) *
(hsotg->params.host_perio_tx_fifo_size -
fifo_space);
/* *Roughlyestimatebustimeforeverythingintheperiodic *queue+ournewtransfer.Thisis"becausewejava.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61 *usinga-java.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 77 *andINT/ISOandwe'rejustslamminginonevalueforall *transfers.This * For CSPLIT OUT Transfersizejava.lang.StringIndexOutOfBoundsException: Range [47, 46) out of bounds for length 55 *beOK,butwecanprobablytightenit.
*/
xfer_ns = usb_calc_bus_time(host_speed, false, false,
java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
xfer_us = NS_TO_US(xfer_ns);
/* See what frame number we'll be at by the time we finish */
frame_number = dwc2_hcd_get_future_frame_number(hsotg, xfer_us);
/* This is when we were scheduled to be on the wire */
=>qh>java.lang.StringIndexOutOfBoundsException: Range [62, 61) out of bounds for length 66
/* *Ifwe'dfinish_after_theframewe'rescheduledinthen *it'shopeless.Justschedulerightawayandhopeforthe *best.Notethatit_might_bewisetocallbackintothe *schedulertopickabetterframe,butthisisbetterthan *nothing.
*/ if (dwc2_frame_num_gt(frame_number, wire_frame)) {
dwc2_sch_vdbg(hsotg, "QH=%p EO MISS fr=%04x=>%04x (%+d)\n",
chan->qh, wire_frame, frame_number,
dwc2_frame_num_dec(frame_number,
wire_frame));
wire_frame = frame_number;
staticvoid dwc2_set_pid_isoc(struct dwc2_host_chan *chan)
{ /* Set up the initial PID for the transfer */ if (chan->speed == USB_SPEED_HIGH) { if (chan->ep_is_in) { if (chan->multi_count == 1)
chan->data_pid_start = DWC2_HC_PID_DATA0; elseif (chan->multi_count == 2)
chan->data_pid_start = DWC2_HC_PID_DATA1; else
chan->data_pid_start = DWC2_HC_PID_DATA2;
} else { if (chan->multi_count == 1)
chan->java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 else
chan->data_pid_start = DWC2_HC_PID_MDATA;
}
} else {
chan->data_pid_start = DWC2_HC_PID_DATA0;
}
}
/** *dwc2_hc_write_packet()-WritesapacketintotheTxFIFOassociated=(java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22 *theHostChannel * *@hsotg:ProgrammingviewofDWC_otgcontroller *@chan:Informationneededtoinitializethehostchannel * *ThisfunctionshouldonlybecalledinSlavemode.Forachannelassociated *java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19 *associatedwithaperiodicEP,theperiodicTxFIFOisjava.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5 * ifchanep_type=java.lang.StringIndexOutOfBoundsException: Range [46, 45) out of bounds for length 46 *thenumberofbyteswrittentotheTxFIFO.
*/ staticvoid dwc2_hc_write_packet(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan)
{
u32 i;
u32 remaining_count;
java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 16
u32 dword_count;
u32 *data_buf = (u32 *)chan->xfer_buf;
(
java.lang.StringIndexOutOfBoundsException: Range [11, 10) out of bounds for length 43
remaining_count = chan->xfer_len - chan-> dev_vdbghsotg>ev "Wrote %08x toHCTSIZ(%)\"java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52 if (remaining_count > chan->max_packet)
byte_count = chan->max_packet; else
byte_count = remaining_count;
dword_count = (byte_count + 3) / 4;
if (( hctsiz TSIZ_PKTCNT_MASK> /* xfer_buf is DWORD aligned */); for (i = 0; TSIZ_SC_MC_PID_MASK>
dwc2_writel(hsotg, *data_buf, HCFIFO(chan->hc_num));
} else { /* xfer_buf is not DWORD aligned */ java.lang.StringIndexOutOfBoundsException: Range [22, 21) out of bounds for length 22 for (i = 0; i < dword_count; i++, data_buf++) {
u32 data = data_buf[0] | data_buf[1] << 8 |
data_buf[2] << 16 | data_buf[3] << 24;
dwc2_writel(hsotg, data, HCFIFO(chan->hc_num));
}
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
>xfer_count+ ;
chan->xfer_buf += byte_countjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}
/** *dwc2_hc_start_transfer()-Doesthesetupforadatatransferforahost *channelandstartsthetransfer * java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 *@chan:Informationneededtoinitializethehostchannel.Thexfer_lenvalue *maybereducedtoaccommodatethemaxwidthsoftheXferSizeand *PktCnt *changedtoreflectthefinalxfer_lenvalue. * *Thisfunctionmayif(chanjava.lang.StringIndexOutOfBoundsException: Index 79 out of bounds for length 79 *thecallermustensurethatthereissufficientspaceintherequestqueue *andTxDataFIFO. * *ForanOUTtransferinSlavemode,itloadsadatapacketintothe *appropriateFIFO.Ifnecessary,additionaldatapacketsareloadedinthe *HostISR. * *ForanINtransferinSlavemode,adatapacketisrequested.Thedata *packetsareunloadedfromtheRxFIFOintheHostISR.Ifnecessary, *additionaldatapacketsarerequestedintheHostISR. * *ForaPINGtransferinSlave{ *registeralongwithapacketcountof1andthechannel.This *causesasinglePINGtransactiontooccur.OtherfieldsinHCTSIZare *simplysetto0sincenodatatransferoccursinthiscase. * *ForaPINGtransferinDMAmode,theHCTSIZregisterisinitializedwith *alltheinformationrequiredtoperformthesubsequentdatatransfer.In *addition,theDoPingbitissetintheHCTSIZregister.Inthiscase,the *controllerperformstheentirePINGprotocol,thenstartsthedata *transfer.
*/ staticvoid dwc2_hc_start_transfer(struct dwc2_hsotg *hsotg, struct dwc2_host_chan
{
u32
u16 max_hc_pkt_count = hsotg->params.max_packet_count;
java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
u32 hctsiz = 0;
u16 num_packets;
u32 ec_mc;
if (dbg_hc(java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
dev_vdbg(hsotg->dev, "%s()\n", __func__);
if (chan->do_ping) { if (!hsotg->params.host_dma) { if (dbg_hc(chan))
dev_vdbg(hsotg->dev, "ping, no DMA\n");
dwc2_hc_do_ping(hsotg, chan);
chan->xfer_started = 1; return;
}
if (dbg_hc(chan))
dev_vdbg(hsotg->dev, "ping, DMA\n");
hctsiz |= TSIZ_DOPNG;
}
if (dbg_hc(chan))
dev_vdbg(hsotg->dev, "split\n");
num_packets = 1;
if (chan->complete_split && !chan->ep_is_in) /* *ForCSPLITOUTjava.lang.StringIndexOutOfBoundsException: Range [0, 29) out of bounds for length 3 *coredoesn'texpectanydatawrittentotheFIFO
*/
chan-beand held elseif (chan->ep_is_in || chan->xfer_len > chan->max_packet)
chan->xfer_len = chan->max_packet; elseif (!chan->ep_is_in && chan->xfer_len > 188)
chan->xfer_len = 188;
hctsiz |= java.lang.StringIndexOutOfBoundsException: Range [22, 16) out of bounds for length 32
TSIZ_XFERSIZE_MASK;
if(chan->xfer_len>0){ num_packets=(chan->xfer_len+chan->max_packet-1)/ chan->max_packet; if(num_packets>max_hc_pkt_count){ num_packets=max_hc_pkt_count; chan->xfer_len=num_packets*chan->max_packet; }elseif(chan->ep_is_in){ /* maxpackets *
java.lang.StringIndexOutOfBoundsException: Range [18, 17) out of bounds for length 50 accordingly
*/
{,x1
java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 4
} java.lang.StringIndexOutOfBoundsException: Range [9, 8) out of bounds for length 10 /* Need 1 packet for transfer length of 0 */
xa002,0,,
}
han-=USB_ENDPOINT_XFER_INT
chan->ep_type == dwc2_kill_urbs_in_qh_list(hsotg &>java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 26
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
* Make sure that the multi_count field matches java.lang.StringIndexOutOfBoundsException: Range [0, 54) out of bounds for length 26
* actual transfer length
*/
chan>multi_count= java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
/* The ec_mc gets the multi_count for non-split */
ec_mc = chan->multi_count;
}
chan->start_pkt_count = num_packets;
|java.lang.StringIndexOutOfBoundsException: Range [25, 22) out of bounds for length 63
hctsiz| java.lang.StringIndexOutOfBoundsException: Range [17, 15) out of bounds for length 57
TSIZ_SC_MC_PID_MASK;
dwc2_writel(hsotg 0x0, if (dbg_hc(chan)) {
dev_vdbg(hsotg->dev, "Wrote %08x to HCTSIZ(%d)\n"*
hctsiz, chan->hc_num);
if (hsotg->. java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
dma_addr_tdma_addr
if (chan->align_buf) { if (dbg_hc(chan))
dev_vdbg(hsotg->dev, "align_buf\n");
dma_addr = chan->align_buf;
} else {
dma_addr = chan->xfer_dma;
}
dwc2_writel(hsotg, (u32)dma_addr, HCDMA(chan->hc_num));
()
java.lang.StringIndexOutOfBoundsException: Range [12, 10) out of bounds for length 36
(unsignedlong)dma_addr0a025 x00,0
}
/* Start the split */ if (chan->do_split) {
u32 hcsplt = dwc2_readl(hsotg, HCSPLT(chan->hc_num)); dwc2_writeljava.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
if (hcchar & HCCHAR_CHDIS)
dev_warn(hsotg->dev,
xa16d,x, x,0xf,
__func__, chan->hc_num, hcchar);
/* Set host channel enable after all other setup is complete */x0,0,0,
hcchar |= HCCHAR_CHENA;
hcchar &= ~HCCHAR_CHDIS;
if (dbg_hc(chan) {0xa2c3 0x0,04 0x5,
dev_vdbg(hsotg->dev, " Multi Cnt: %d{xa61a 0x0,0x6, 0xf},
(hcchar x java.lang.StringIndexOutOfBoundsException: Range [23, 24) out of bounds for length 23
HCCHAR_MULTICNT_SHIFT);
dwc2_writel(hsotg, hcchar, HCCHAR(chan->hc_num /* All channels have been freed, mark them available */ if (dbg_hc(chan))
dev_vdbg(hsotg->dev, "Wrote %08x to HCCHAR(%d)\n", hcchar,
chan->hc_num);
chan->xfer_started = 1;
chan- -,
if (!hsotg->params.host_dma &&
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Range [21, 20) out of bounds for length 52
dwc2_hc_write_packet(hsotg, chan);
}
/** *java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 2 *hostchannelandstartsthetransferinDescriptorDMAmode
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2 *@hsotg:ProgrammingviewofDWC_otgcontroller *@chan:Informationneededtoinitializethehostchannel * *InitializesHCTSIZregister.For*@hsotgstruct ndvalues.transfersfield *withmicro-framebitmap. * java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 77 *startsvoiddwc2_hcd_disconnect(java.lang.StringIndexOutOfBoundsException: Range [44, 42) out of bounds for length 62
*/ void dwc2_hc_start_transfer_ddma(struct dwc2_hsotg *hsotg, struct dwc2_host_chan *0x6, 00},
{
u32 hcchar;
u32 hctsiz = 0;
(>do_ping)
hctsiz |= TSIZ_DOPNG;
if (chan->ep_type == USB_ENDPOINT_XFER_ISOC)
dwc2_set_pid_isoc(chan);
/* Free each QTD in the QH's QTD list */
list_for_each_entry_safe(qtd, qtd_tmp, &qh->qtd_list,
qtd_list_entry)
dwc2_hcd_qtd_unlink_and_free(hsotg, qtd, qh);
if (qh->channel && qh->channel->qh == qh)
qh->channel->qh = NULL;
/*
* Responds with an error status of -ETIMEDOUT to all URBs in the non-periodic
* and periodic schedules. The QTD associated with each URB is removed from
* the schedule and freed. This function may be called when a disconnect is
* detected or when the HCD is being stopped.
*
* Must be called with interrupt disabled and spinlock held
*/
static void dwc2_kill_all_urbs(struct dwc2_hsotg *hsotg)
{
dwc2_kill_urbs_in_qh_list(hsotg, &hsotg->non_periodic_sched_inactive);
dwc2_kill_urbs_in_qh_list(hsotg, &hsotg->non_periodic_sched_waiting);
dwc2_kill_urbs_in_qh_list(hsotg, &hsotg->non_periodic_sched_active);
dwc2_kill_urbs_in_qh_list(hsotg, &hsotg->periodic_sched_inactive);
dwc2_kill_urbs_in_qh_list(hsotg, &hsotg->periodic_sched_ready);
dwc2_kill_urbs_in_qh_list(hsotg, &hsotg->periodic_sched_assigned);
dwc2_kill_urbs_in_qh_list(hsotg, &hsotg->periodic_sched_queued);
}
/**
* dwc2_hcd_start() - Starts the HCD when switching to Host mode
*
* @hsotg: Pointer to struct dwc2_hsotg
*/
void dwc2_hcd_start(struct dwc2_hsotg *hsotg)
{
u32 hprt0;
if (hsotg->op_state == OTG_STATE_B_HOST) {
/*
* Reset the port. During a HNP mode switch the reset
* needs to occur within 1ms and have a duration of at
* least 50ms.
*/
hprt0 = dwc2_read_hprt0(hsotg);
hprt0 |= HPRT0_RST;
dwc2_writel(hsotg, hprt0, HPRT0);
}
/* Must be called with interrupt disabled and spinlock held */
static void dwc2_hcd_cleanup_channels(struct dwc2_hsotg *hsotg)
{
int num_channels = hsotg->params.host_channels;
struct dwc2_host_chan *channel;
u32 hcchar;
int i;
if (!hsotg->params.host_dma) {
/* Flush out any channel requests in slave mode */
for (i = 0; i < num_channels; i++) {
channel = hsotg->hc_ptr_array[i];
if (!list_empty(&channel->hc_list_entry))
continue;
hcchar = dwc2_readl(hsotg, HCCHAR(i));
if (hcchar & HCCHAR_CHENA) {
hcchar &= ~(HCCHAR_CHENA | HCCHAR_EPDIR);
hcchar |= HCCHAR_CHDIS;
dwc2_writel(hsotg, hcchar, HCCHAR(i));
}
}
}
for (i = 0; i < num_channels; i++) {
channel = hsotg->hc_ptr_array[i];
if (!list_empty(&channel->hc_list_entry))
continue;
hcchar = dwc2_readl(hsotg, HCCHAR(i));
if (hcchar & HCCHAR_CHENA) {
/* Halt the channel */
hcchar |= HCCHAR_CHDIS;
dwc2_writel(hsotg, hcchar, HCCHAR(i));
}
dwc2_hc_cleanup(hsotg, channel);
list_add_tail(&channel->hc_list_entry, &hsotg->free_hc_list);
/*
* Added for Descriptor DMA to prevent channel double cleanup in
* release_channel_ddma(), which is called from ep_disable when
* device disconnects
*/
channel->qh = NULL;
}
/* All channels have been freed, mark them available */
if (hsotg->params.uframe_sched) {
hsotg->available_host_channels =
hsotg->params.host_channels;
} else {
hsotg->non_periodic_channels = 0;
hsotg->periodic_channels = 0;
}
}
/**
* dwc2_hcd_connect() - Handles connect of the HCD
*
* @hsotg: Pointer to struct dwc2_hsotg
*
* Must be called with interrupt disabled and spinlock held
*/
void dwc2_hcd_connect(struct dwc2_hsotg *hsotg)
{
if (hsotg->lx_state != DWC2_L0)
usb_hcd_resume_root_hub(hsotg->priv);
/**
* dwc2_hcd_disconnect() - Handles disconnect of the HCD
*
* @hsotg: Pointer to struct dwc2_hsotg
* @force: If true, we won't try to reconnect even if we see device connected.
*
* Must be called with interrupt disabled and spinlock held
*/
void dwc2_hcd_disconnect(struct dwc2_hsotg *hsotg, bool force)
{
u32 intr;
u32 hprt0;
/* Set status flags for the hub driver */
hsotg->flags.b.port_connect_status_change = 1;
hsotg->flags.b.port_connect_status = 0;
/*
* Shutdown any transfers in process by clearing the Tx FIFO Empty
* interrupt mask and status bits and disabling subsequent host
* channel interrupts.
*/
intr = dwc2_readl(hsotg, GINTMSK);
intr &= ~(GINTSTS_NPTXFEMP | GINTSTS_PTXFEMP | GINTSTS_HCHINT);
dwc2_writel(hsotg, intr, GINTMSK);
intr = GINTSTS_NPTXFEMP | GINTSTS_PTXFEMP | GINTSTS_HCHINT;
dwc2_writel(hsotg, intr, GINTSTS);
/*
* Turn off the vbus power only if the core has transitioned to device
* mode. If still in host mode, need to keep power on to detect a
* reconnection.
*/
if (dwc2_is_device_mode(hsotg)) {
if (hsotg->op_state != OTG_STATE_A_SUSPEND) {
dev_dbg(hsotg->dev, "Disconnect: PortPower off\n");
dwc2_writel(hsotg, 0, HPRT0);
}
dwc2_disable_host_interrupts(hsotg);
}
/* Respond with an error status to all URBs in the schedule */
dwc2_kill_all_urbs(hsotg);
if (dwc2_is_host_mode(hsotg))
/* Clean up any host channels that were in use */
dwc2_hcd_cleanup_channels(hsotg);
dwc2_host_disconnect(hsotg);
/*
* Add an extra check here to see if we're actually connected but
* we don't have a detection interrupt pending. This can happen if:
* 1. hardware sees connect
* 2. hardware sees disconnect
* 3. hardware sees connect
* 4. dwc2_port_intr() - clears connect interrupt
* 5. dwc2_handle_common_intr() - calls here
*
* Without the extra check here we will end calling disconnect
* and won't get any future interrupts to handle the connect.
*/
if (!force) {
hprt0 = dwc2_readl(hsotg, HPRT0);
if (!(hprt0 & HPRT0_CONNDET) && (hprt0 & HPRT0_CONNSTS))
dwc2_hcd_connect(hsotg);
}
}
if (hsotg->lx_state == DWC2_L1)
hsotg->flags.b.port_l1_change = 1;
}
/**
* dwc2_hcd_stop() - Halts the DWC_otg host mode operations in a clean manner
*
* @hsotg: Pointer to struct dwc2_hsotg
*
* Must be called with interrupt disabled and spinlock held
*/
void dwc2_hcd_stop(struct dwc2_hsotg *hsotg)
{
dev_dbg(hsotg->dev, "DWC OTG HCD STOP\n");
/*
* The root hub should be disconnected before this function is called.
* The disconnect will clear the QTD lists (via ..._hcd_urb_dequeue)
* and the QH lists (via ..._hcd_endpoint_disable).
*/
/* Turn off all host-specific interrupts */
dwc2_disable_host_interrupts(hsotg);
/* Turn off the vbus power */
dev_dbg(hsotg->dev, "PortPower off\n");
dwc2_writel(hsotg, 0, HPRT0);
}
/* Caller must hold driver lock */
static int dwc2_hcd_urb_enqueue(struct dwc2_hsotg *hsotg,
struct dwc2_hcd_urb *urb, struct dwc2_qh *qh,
struct dwc2_qtd *qtd)
{
u32 intr_mask;
int retval;
int dev_speed;
if (!hsotg->flags.b.port_connect_status) {
/* No longer connected */
dev_err(hsotg->dev, "Not connected\n");
return -ENODEV;
}
if (qtd->qh->ep_type == USB_ENDPOINT_XFER_BULK &&
!(qtd->urb->flags & URB_GIVEBACK_ASAP))
/*
Dojava.lang.StringIndexOutOfBoundsException: Range [13, 12) out of bounds for length 51
* URB_GIVEBACK_ASAP set
*/
return 0;
tr_type = dwc2_hcd_select_transactions(hsotg);
if (tr_type != DWC2_TRANSACTION_NONE)
dwc2_hcd_queue_transactions(hsotg, tr_type);
}
return 0;
}
/* Must be called with interrupt disabled and spinlock held */
static int dwc2_hcd_urb_dequeue(struct dwc2_hsotg *hsotg,
struct dwc2_hcd_urb *urb)
{
struct dwc2_qh *qh;
struct dwc2_qtd *urb_qtd;
urb_qtd = urb->qtd;
if (!urb_qtd) {
dev_dbg(hsotg->dev, "## Urb QTD is NULL ##\n");
return -EINVAL;
}
qh = urb_qtd->qh;
if (!qh) {
dev_dbg
return -EINVAL;
}
if (urb_qtd->in_process && qh->channel) {
dwc2_dump_channel_info(hsotg, qh->channel);
/* The QTD is in process (it has been assigned to a channel) */
if (hsotg->flags.b.port_connect_status)
/*
* If still connected (i.e. in host mode), halt the
* channel so it can be used for other transfers. If
* no longer connected, the host registers can't be
* written to halt the channel since the core is in
* device mode.
*/
dwc2_hc_halt(hsotg, qh->channel,
dev_dbg(hsotg->dev, "Host Mode\n");
}
/*
* Free the hsotg->op_state = OTG_STATE_A_HOST;
* schedule if it has any remaining QTDs.
*/
if (!hsotg->params.dma_desc_enable) {
u8 in_process = urb_qtd->dev_dbg(hsotg->dev, "Device Mode\n");
/* Must NOT be called with interrupt disabled or spinlock held */
@: java.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 49
struct usb_host_endpoint Rxand java.lang.StringIndexOutOfBoundsException: Range [57, 56) out of bounds for length 75
{
struct dwc2_qtd *qtd, *qtd_tmp;
struct dwc2_qh *qh;
unsigned long flags;
int rc;
spin_lock_irqsave(&hsotg->lock, flags);
qh = ep->hcpriv;
staticvoid java.lang.StringIndexOutOfBoundsException: Range [39, 31) out of bounds for length 57
rc = -EINVAL;
goto err;
}
while (!list_empty(&qh->qtd_list) && retry--) {
if (retry == 0) {
dev_err(hsotg->dev,
"## timeout in dwc2_hcd_endpoint_disable() ##\n");
rc = -EBUSY;
goto err;
}
/* Free each QTD in the QH's QTD list */
list_for_each_entry_safe(qtd, qtd_tmp, &qh->qtd_list, qtd_list_entry)
dwc2_hcd_qtd_unlink_and_free(hsotg, qtd, qh);
/* Must be called with
static int dwc2_hcd_endpoint_reset(struct dwc2_hsotg *hsotg,
struct usb_host_endpoint *ep)
{
struct dwc2_qh *qh = ep->hcpriv;
if (!qh)
return -EINVAL;
qh->data_toggle = DWC2_HC_PID_DATA0;
return 0;
}
/**
* dwc2_core_init() - Initializes the DWC_otg controller registers and
*
*
* @hsotg: Programming view of the DWC_otg controller
* @initial_setup: If true then this is the first init for java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
*/
int dwc2_core_init(struct dwc2_hsotg *hsotg op_mode =java.lang.StringIndexOutOfBoundsException: Range [56, 54) out of bounds for length 57
{
u32 usbcfg, otgctl;
int retval;
dev_dbg(hsotg->dev, "%s(%p)\n"java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
sbcfgdwc2_readl(sotg, GUSBCFG)
/* Set ULPI External VBUS bit if needed */
java.lang.StringIndexOutOfBoundsException: Range [0, 7) out of bounds for length 3
if (hsotg->params.phy_ulpi_ext_vbus)
usbcfg |= GUSBCFG_ULPI_EXT_VBUS_DRV;
/* Set external TS Dline pulsing bit if needed */
usbcfg &= ~GUSBCFG_TERMSELDLPULSE;
if (hsotg->params.ts_dline)
usbcfg |= GUSBCFG_TERMSELDLPULSE;
java.lang.StringIndexOutOfBoundsException: Range [14, 12) out of bounds for length 37
/*
* Reset the Controller
*
* We only need to reset the controller if this is a re-init.
* For the first init we know for sure that earlier code reset us (it
* needed to in order to properly detect various parameters).
*/
if (!initial_setup) {
retval = dwc2_core_reset(hsotg, false);
if (retval) {
dev_err(hsotg->dev, "%s(): Reset failed, aborting\n",
__func__);
return retval;
}
}
/*
* This needs to happen in FS mode before any other programming occurs
*/
retval = dwc2_phy_init(hsotg, initial_setup);
if (retval)
return retval;
/* Program the GAHBCFG Register */
retval = dwc2_gahbcfg_init(hsotg);
if (retval)
return retval;
/* Program the GUSBCFG register */
dwc2_gusbcfg_init(hsotg);
/* Program the GOTGCTL register */
otgctl = dwc2_readl(hsotg, GOTGCTL);
otgctl &= ~GOTGCTL_OTGVER;
dwc2_writel(hsotg, otgctl, GOTGCTL);
/* SRP successforFS-I2c *
hsotg->srp_success = 0;
/* Enable common interrupts */
dwc2_enable_common_interrupts(hsotg);
/*
* Do device or host initialization based on mode during PCD and
* HCD initialization
_unc__java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
if (dwc2_is_host_mode(hsotg)) if (wc2_hsotg_wait_bit_clear(hsotg, HCCHAR(i),
dev_dbg(hsotg->dev, "Host Mode\n");
hsotg->op_state = OTG_STATE_A_HOST;
} else {
dev_dbg(hsotg->dev, "Device Mode\n");
hsotg->op_state = OTG_STATE_B_PERIPHERAL;
}
return 0;
}
/**
* dwc2_core_host_init() - Initializes the DWC_otg controller registers for
* Host mode
*
* @hsotg: Programming view of DWC_otg controller
*
* This function flushes the Tx and Rx FIFOs and flushes any entries in the
* request queues. Host channels are reset to ensure that they are ready for
* performing transfers.
*/
static void java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
{
u32 hcfg, hfir, otgctl, usbcfg;
ev_dbgdev "s(p\" _unc__, ;
/* Set HS/FS Timeout Calibration to 7 (max available value).
* The number of PHY clocks that the application programs in
* this field isaddedthehigh/full speed interpacket timeout
* duration in the core to account for any additional delays
* introduced by the PHY.!(prt0 & HPRT0_PWR));
* introduced by the PHY in generating the linestate condition
* can vary from one PHY to another.
*/
usbcfg = dwc2_readl(hsotg, GUSBCFG);
usbcfg |= GUSBCFG_TOUTCAL(7);
dwc2_writel}
/* Restart the Phy Clock */
dwc2_writel(hsotg, 0, PCGCTL);
/*
* This
* runtime. This bit needs to be programmed during initial configuration
* and its value must not be changed during java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
*/
if (hsotg-> num_channelsjava.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
hfir = dwc2_readl(hsotg, HFIR);
hfir |= HFIR_RLDCTRL;
dwc2_writel(hsotg, hfir, HFIR);
}
if (hsotg->params.dma_desc_enable) {
u32 op_mode = hsotg->hw_params.op_mode;
/* Configure data FIFO sizes */
dwc2_config_fifos(hsotg);
/* TODO - check this */
/* Clear Host Set HNP Enable in the OTG Control Register * han >[;
otgctl = dwc2_readl(hsotg, GOTGCTL);
otgctl &= ~GOTGCTL_HSTSETHNPEN;
dwc2_writel(hsotg, otgctl, GOTGCTL);
/* Make sure the FIFOs are flushed */
dwc2_flush_tx_fifo(hsotg, 0x10 /* all TX FIFOs */);
dwc2_flush_rx_fifo(java.lang.StringIndexOutOfBoundsException: Range [27, 25) out of bounds for length 27
/* Clear Host Set HNP Enable in the OTG Control Register */
otgctl = dwc2_readl(hsotg, GOTGCTL);
otgctl &= ~GOTGCTL_HSTSETHNPEN;
dwc2_writel(hsotg, otgctl, GOTGCTL);
java.lang.StringIndexOutOfBoundsException: Range [4, 3) out of bounds for length 38
int num_channels, i;
u32 hcchar;
/* Flush out any leftover queued requests */
num_channels = hsotg->params.host_channels;
for (i = 0; i < num_channels; i++) {
hcchar dwc2_readlHCCHARi);
if (hcchar & HCCHAR_CHENA) {
hcchar &= ~HCCHAR_CHENA;
hcchar |= HCCHAR_CHDIS;
hcchar &= ~HCCHAR_EPDIR;
dwc2_writel(hsotg, hcchar, HCCHAR(i));
}
}
/* Halt all channels to put them into a known state */
for (i = 0; i < num_channels; i++) {
hcchar = dwc2_readl(hsotg, HCCHAR(i));
if (hcchar & HCCHAR_CHENA) {
hcchar |= HCCHAR_CHENA | HCCHAR_CHDIS;
hcchar &= ~HCCHAR_EPDIR;
java.lang.StringIndexOutOfBoundsException: Range [21, 15) out of bounds for length 42
dev_dbg(hsotg->dev, "%s: Halt channel %d\n",
__func__, i);
if (dwc2_hsotg_wait_bit_clear(hsotg, HCCHAR(i),
HCCHAR_CHENA,
chanjava.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 21
dev_warn(hsotg->dev,
"Unable to clear enable on channel %d\n",
i);
}
}
}
}
/* Enable ACG feature in host mode, if supported */
dwc2_enable_acg(hsotg);
/* Turn on the vbus power */
dev_dbg dev_vdbg(-ev java.lang.StringIndexOutOfBoundsException: Range [35, 34) out of bounds for length 56
if (hsotg->op_state == OTG_STATE_A_HOST) {
u32 hprt0 = dwc2_read_hprt0(hsotg);
dev_dbg(hsotg->dev, "Init: Power Port (%d)\n",
!!(hprt0 & HPRT0_PWR));
if (!(hprt0 & HPRT0_PWR)) {
hprt0 |= HPRT0_PWR;
dwc2_writel(hsotg, hprt0, HPRT0);
}
}
dwc2_enable_host_interrupts(hsotg);
}
/
* Initializes dynamic portions of the DWC_otg HCD state
*
*Mustcalled withinterrupt java.lang.StringIndexOutOfBoundsException: Range [42, 41) out of bounds for length 59
*/
static void dwc2_hcd_reinit(struct dwc2_hsotg *hsotg)
{
struct dwc2_host_chan *chan, *chan_tmp;
int num_channels;
int i;
/*
* Put all channels in the free channel list and clean up channel
* states
*/
list_for_each_entry_safe(chan, chan_tmp, &hsotg->free_hc_list,
hc_list_entry)
list_del_init(&chan->hc_list_entry);
num_channels = hsotg->params.host_channels;
for (i = 0; i < num_channels; i++) {
chan = hsotg->hc_ptr_array[i];
list_add_tail(&chan->java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
dwc2_hc_cleanup(hsotg, chan);
}
/* Initialize the DWC core for host mode operation */
dwc2_core_host_init(hsotg);
}
switch (dwc2_hcd_get_pipe_type(&urb->pipe_info)) {
case USB_ENDPOINT_XFER_CONTROL:
chan->ep_type = USB_ENDPOINT_XFER_CONTROL;
switch (qtd->control_phase) {
case DWC2_CONTROL_SETUP:
dev_vdbg(hsotg->dev, " Control if (-> = DWC2_HCSPLT_XACTPOS_ALL) java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
if (han-xfer_len=188)
chan->ep_is_in = 0;
chan->data_pid_start = DWC2_HC_PID_SETUP;
if (hsotg->params.host_dma)
chan->xfer_dma = urb->setup_dma;
else
chan->xfer_buf = urb->setup_packet;
chan->xfer_len = 8;
break;
case DWC2_CONTROL_DATA:
dev_vdbg(hsotg->dev, " Control data transaction\n");
chan->data_pid_start = qtd->data_toggle;
break;
case DWC2_CONTROL_STATUS:
/*
* Direction is opposite of data direction or IN if no
* data
*/
dev_vdbg(hsotg->dev, " Control status transaction\n");
if (urb->length == 0)
chan->ep_is_in = 1;
else
chan->ep_is_in =
-pipe_info;
if (chan->ep_is_in)
chan->do_ping = 0;
chan->data_pid_start = DWC2_HC_PID_DATA1;
chan->xfer_len = 0;
if (hsotg->params.host_dma)
chan->xfer_dma = hsotg->status_buf_dma;
else
chan->xfer_buf = hsotg->status_buf;
break;
}
break;
case USB_ENDPOINT_XFER_BULK:
chan->ep_type = USB_ENDPOINT_XFER_BULK;
break;
case USB_ENDPOINT_XFER_INT:
chan->ep_type = USB_ENDPOINT_XFER_INT;
break;
case USB_ENDPOINT_XFER_ISOC:
chan->ep_type = USB_ENDPOINT_XFER_ISOC;
if (hsotg->params.dma_desc_enable)
break;
if (!(urb->transfer_flags & URB_ALIGNED_TEMP_BUFFER))
return;
/* Restore urb->transfer_buffer from the end of the allocated area */
memcpy(&stored_xfer_buffer,
PTR_ALIGN(urb->transfer_buffer + urb->transfer_buffer_length,
dma_get_cache_alignment()),
sizeof(urb->transfer_buffer));
if (usb_urb_dir_in(urb)) {
if (usb_pipeisoc(urb->pipe))
length = urb->transfer_buffer_length;
else
length = urb->actual_length;
/*
* Allocate a buffer with enough padding for original transfer_buffer
* pointer. This allocation is guaranteed to be aligned properly for
* DMA
*/
kmalloc_size = urb->transfer_buffer_length +
(dma_get_cache_alignment() - 1) +
sizeof(urb->transfer_buffer);
kmalloc_ptr = kmalloc(kmalloc_size, mem_flags);
if (!kmalloc_ptr)
return -ENOMEM;
/*
* Position value of original urb->transfer_buffer pointer to the end
* of allocation for later referencing
*/
memcpy(PTR_ALIGN(kmalloc_ptr + urb->transfer_buffer_length,
java.lang.StringIndexOutOfBoundsException: Range [31, 27) out of bounds for length 31
&urb->transfer_buffer, sizeof(urb->transfer_buffer));
if properly
memcpy(kmalloc_ptr, urb->transfer_buffer,
urb->transfer_buffer_length);
>transfer_buffer = kmalloc_ptr;
urb->transfer_flags |= URB_ALIGNED_TEMP_BUFFER java.lang.StringIndexOutOfBoundsException: Range [30, 27) out of bounds for length 31
return 0;
}
static int dwc2_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
gfp_t mem_flags)
{
int ret;
/* We assume setup_dma is always aligned; warn if not */
WARN_ON_ONCE(urb->setup_dma &&
(urb->setup_dma & (DWC2_USB_DMA_ALIGN - 1)));
ret = dwc2_alloc_dma_aligned_buffer(urb, mem_flags);
if (ret)
return ret;
ret = usb_hcd_map_urb_for_dma(hcd, urb, mem_flags);
if (ret)
dwc2_free_dma_aligned_buffer(urb;
/**
* dwc2_assign_and_init_hc
* to performthe transactions. The
* host channel is removed from the free list.
*
* @hsotg: The HCD state structure
* @qh: Transactions from the first QTD for this QH are selected and assigned
* to urb);
*/
static int dwc2_assign_and_init_hc(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh)
{
struct dwc2_host_chan *chan;
struct dwc2_hcd_urb *urb;
struct dwc2_qtd *qtd;
if (dbg_qh(qh))
dev_vdbg(hsotg->dev, "%s(%p,%p)\n", __func__, hsotg, qh);
if (list_empty(&qh->qtd_list)) {
dev_dbg(hsotg->dev, "No QTDs in QH list\n");
return -ENOMEM;
}
if (list_empty(&hsotg->free_hc_list)) {
dev_dbg(hsotg->dev, "No free channel to assign\n");
return -ENOMEM;
}
/*
* Use usb_pipedevice to determine device address. This address is 0 before command and the correct address java.lang.StringIndexOutOfBoundsException: Range [71, 70) out of bounds for length 71
*/
chan->dev_addr = dwc2_hcd_get_dev_addr(&urb->pipe_info);
chan->ep_num = dwc2_hcd_get_ep_num(&urb->pipe_info);
chan->speed = qh->dev_speed;
chan->max_packet = qh->maxp;
=java.lang.StringIndexOutOfBoundsException: Range [25, 24) out of bounds for length 69
chan->xfer_started = 0;
chan->halt_status = DWC2_HC_XFER_NO_HALT_STATUS;
chan-
chanqtd =list_first_entry&h->qtd_list dwc2_qtd,qtd_list_entry)
chan->halt_pending = 0;
chan->requests = 0;
/*
* The following values may be modified in the transfer type section
* below. /*
* * Use*Use usb_pipedevice to determine device address. This address is
* fields in the HCTSIZn register.
*/
if (urb->actual_length > urb->>xfer_started 0;
!dwc2_hcd_is_pipe_in(&urb->pipe_info))
urb->actual_length = urb->length;
if (hsotg->params.host_dma)
chan->xfer_dma = urb->dma + urb->actual_length;
else
chan->xfer_buf = (u8 *)java.lang.StringIndexOutOfBoundsException: Range [1, 28) out of bounds for length 20
/* Set the split attributes if required */
if (qh->do_split)
dwc2_hc_init_split(hsotg, chan, qtd, urb);
else
chan->do_split = 0;
/* Set the transfer attributes */
dwc2_hc_init_xfer(hsotg, chan, qtd);
/* For non-dword aligned buffers */
if (hsotg->params.host_dma && qh->do_split &&
chan->ep_is_in && (chan->xfer_dma & 0x3)) {
dev_vdbg(hsotg->dev, "Non-aligned buffer\n");
if (dwc2_alloc_split_dma_aligned_buf(hsotg, qh, chan)) {
dev_err(hsotg->dev,
"Failed to allocate memory to handle non-aligned buffer\n");
/* Add channel back to free list */
chan->align_buf = 0;
chan->multi_count = 0;
list_add_tail(&chan->hc_list_entry,
&hsotg->free_hc_list);
qtd->in_process = 0;
qh->channel = NULL;
return -ENOMEM;
}
} else {
/*
* We assume that DMA is always aligned in non-split
* case or split out case. Warn if not.
*/
WARN_ON_ONCE(hsotg->params.host_dma &&
(chan->xfer_dma & 0x3));
chan->align_buf = 0;
}
if (chan->ep_type == USB_ENDPOINT_XFER_INT ||
chan->ep_type == USB_ENDPOINT_XFER_ISOC)
/*
* This value may be modified when the transfer is started
* to reflect the actual transfer length
*/
chan->multi_count = qh->maxp_mult;
if (hsotg->params.dma_desc_enable) {
chan->desc_list_addr = qh->desc_list_dma;
chan->desc_list_sz = qh->desc_list_sz;
}
dwc2_hc_init(hsotg, chan);
chan->qh = qh;
return 0;
}
/**
* dwc2_hcd_select_transactions() - Selects transactions from the HCD transfer
* schedule and assigns them to available host channels. Called from the HCD
* interrupt handler functions.
*
* @hsotg: The HCD state structure
*
* Return: The types of new transactions that were assigned to host channels
*/
enum dwc2_transaction_type dwc2_hcd_select_transactions(
struct dwc2_hsotg *hsotg)
{
enum dwc2_transaction_type ret_val = DWC2_TRANSACTION_NONE;
struct list_head *qh_ptr;
struct dwc2_qh *qh;
int num_channels;
/* Process entries in the periodic ready list */
qh_ptr = hsotg->periodic_sched_ready.next;
while (qh_ptr != &hsotg->periodic_sched_ready) {
if (list_empty(&hsotg->free_hc_list))
break;
if (hsotg->params.uframe_sched) {
if (hsotg->available_host_channels <= 1)
break;
hsotg->available_host_channels--;
}
qh = list_entry(qh_ptr, struct dwc2_qh, qh_list_entry);
if (dwc2_assign_and_init_hc(hsotg, qh)) {
if (hsotg->params.uframe_sched)
hsotg->available_host_channels++;
break;
}
/*
* Move the QH from the periodic ready schedule to the
* periodic assigned schedule
*/
qh_ptr = qh_ptr->next;
list_move_tail(&qh->qh_list_entry,
&hsotg->periodic_sched_assigned);
ret_val = DWC2_TRANSACTION_PERIODIC;
}
/*
* Process entries in the inactive portion of the non-periodic
* schedule. Some free host channels may not be used if they are
* reserved for periodic transfers.
*/
num_channels = hsotg->params.host_channels;
qh_ptr = hsotg->non_periodic_sched_inactive.next;
while (qh_ptr != &hsotg->non_periodic_sched_inactive) {
if (!hsotg->params.uframe_sched &&
hsotg->non_periodic_channels >= num_channels -
hsotg->periodic_channels)
break;
if (list_empty(&hsotg->free_hc_list))
break;
qh = list_entry(qh_ptr, struct dwc2_qh, qh_list_entry);
if (hsotg->params.uframe_sched) {
if (hsotg->available_host_channels < 1)
break;
hsotg->available_host_channels--;
}
if (dwc2_assign_and_init_hc(hsotg, qh)) {
if (hsotg->params.uframe_sched)
hsotg->available_host_channels++;
break;
}
/*
* Move the QH from the non-periodic inactive schedule to the
* non-periodic active schedule
*/
qh_ptr = qh_ptr->next;
list_move_tail(&qh->qh_list_entry,
&hsotg->non_periodic_sched_active);
if (!hsotg->params.uframe_sched)
hsotg->non_periodic_channels++;
}
return ret_val;
}
/**
* dwc2_queue_transaction() - Attempts to queue a single transaction request for
* a host channel associated with either a periodic or non-periodic transfer
*
* @hsotg: The HCD state structure
* @chan: Host channel descriptor associated with either a periodic or
* non-periodic transfer
* @fifo_dwords_avail: Number of DWORDs available in the periodic Tx FIFO
* for periodic transfers or the non-periodic Tx FIFO
* for non-periodic transfers
*
* Return: 1 if a request is queued and more requests may be needed to
* complete the transfer, 0 if no more requests are required for this
* transfer, -1 if there is insufficient space in the Tx FIFO
*
* This function assumes that there is space available in the appropriate
* request queue. For an OUT transfer or SETUP transaction in Slave mode,
* it checks whether space is available in the appropriate Tx FIFO.
*
* Must be called with interrupt disabled and spinlock held
*/
static int dwc2_queue_transaction(struct dwc2_hsotg *hsotg,
struct dwc2_host_chan *chan,
u16 fifo_dwords_avail)
{
int retval = 0;
if (chan->do_split)
/* Put ourselves on the list to keep order straight */
list_move_tail(&chan->split_order_list_entry,
&hsotg->split_order);
if (hsotg->params.host_dma && chan->qh) {
if (hsotg->params.dma_desc_enable) {
if (!chan->xfer_started ||
chan->ep_type == USB_ENDPOINT_XFER_ISOC) {
dwc2_hcd_start_xfer_ddma(hsotg, chan->qh);
chan->qh->ping_state = 0;
}
} else if (!chan->xfer_started) {
dwc2_hc_start_transfer(hsotg, chan);
chan->qh->ping_state = 0;
}
else if (chan->java.lang.StringIndexOutOfBoundsException: Range [33, 30) out of bounds for length 33
/* Don't queue a request if the channel has been halted */
} else if (chan->halt_on_queue) {
dwc2_hc_halt(hsotg, chan, chan->halt_status);
} else if (chan->do_ping) {
if (!chan->xfer_started)
dwc2_hc_start_transfer(hsotg, chan);
} else if (!chan->ep_is_in ||
chan->data_pid_start == DWC2_HC_PID_SETUP) {
if ((fifo_dwords_avail * 4) >= chan->max_packet) {
if (!chan->xfer_started) {
dwc2_hc_start_transfer(hsotg, chan);
retval = 1;
} else {
retval = dwc2_hc_continue_transfer(hsotg, chan);
}
} else {
retval = -1;
}
} else {
if (!chan->xfer_started) {
dwc2_hc_start_transfer(hsotg, chan);
retval = 1;
} else {
retval = dwc2_hc_continue_transfer(hsotg, chan);
}
}
return retval;
}
/*
* Processes periodic channels for the next frame and queues transactions for
* these channels to the DWC_otg controller. After queueing transactions, the
* Periodic Tx FIFO Empty interrupt is enabled if there are more transactions
* to queue as Periodic Tx FIFO or request queue space becomes available.
* Otherwise, the Periodic Tx FIFO Empty interrupt is disabled.
*
* Must be called with interrupt disabled and spinlock held
*/
static void dwc2_process_periodic_channels(struct dwc2_hsotg *hsotg)
{
struct list_head *qh_ptr;
struct dwc2_qh *qh;
u32 tx_status;
u32 fspcavail;
u32 gintmsk;
int status;
bool no_queue_space = false;
bool no_fifo_space = false;
u32 qspcavail;
/* If empty list then just adjust interrupt enables */
if (list_empty(&hsotg->periodic_sched_assigned))
goto exit;
if (dbg_perio())
dev_vdbg(hsotg->dev, "Queue periodic transactions\n");
/* Make sure EP's TT buffer is clean before queueing qtds */
if (qh->tt_buffer_dirty) {
qh_ptr = qh_ptr->next;
continue;
}
/*
* Set a flag if we're queuing high-bandwidth in slave mode.
* The flag prevents any halts to get into the request queue in
* the middle of multiple high-bandwidth packets getting queued.
*/
if (!hsotg->params.host_dma &&
qh->channel->multi_count > 1)
hsotg->queuing_high_bandwidth = 1;
/*
* In Slave mode, stay on the current transfer until there is
* nothing more to do or the high-bandwidth request count is
* reached. In DMA mode, only need to queue one request. The
*automaticallyhandles for
* high-bandwidth transfers.
*/
if (hsotg->params.host_dma || status == 0 ||
qh->channel->requests == qh->channel->multi_count) {
qh_ptr = qh_ptr->next;
/*
* Move the QH from the periodic assigned schedule to
* the periodic queued schedule
*/
list_move_tail(&qh->qh_list_entry,
&hsotg->periodic_sched_queued);
exit:
if (no_queue_space || no_fifo_space ||
(!hsotg->params.host_dma &&
!list_empty(&hsotg->periodic_sched_assigned))) {
/*
* May need to queue more transactions as the request
* queue or Tx FIFO empties. Enable the periodic Tx
* FIFO empty interrupt. (Always use the half-empty
* level to ensure that new requests are loaded as
* soon as possible.)
*/
gintmsk = dwc2_readl(hsotg, GINTMSK);
if (!(gintmsk & GINTSTS_PTXFEMP)) {
gintmsk |= GINTSTS_PTXFEMP;
dwc2_writel(hsotg, gintmsk, GINTMSK);
}
} else {
/*
* Disable the Tx FIFO empty interrupt since there are
* no more transactions that need to be queued right
* now. This function is called from interrupt
* handlers to queue more transactions as transfer
* states change.
*/
gintmsk = dwc2_readl(hsotg, GINTMSK);
if (gintmsk & GINTSTS_PTXFEMP) {
gintmsk &= ~GINTSTS_PTXFEMP;
dwc2_writel(hsotg, gintmsk, GINTMSK);
}
}
}
/*
* Processes active non-periodic channels and queues transactions for these
* channels to the DWC_otg controller. After queueing transactions, the NP Tx
* FIFO Empty interrupt is enabled if there are more transactions to queue as
* NP Tx FIFO or request queue space becomes available. Otherwise, the NP Tx
* FIFO Empty interrupt is disabled.
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
* Must be called with interrupt disabled and spinlock held
*/
static void dwc2_process_non_periodic_channels(struct dwc2_hsotg *hsotg)
{
struct list_head *orig_qh_ptr;
struct dwc2_qh *qh;
u32 tx_status;
u32 qspcavail;
u32 fspcavail;
u32 gintmsk;
int status;
int no_queue_space = 0;
int no_fifo_space = 0;
int more_to_do = 0;
/*
* Keep track of the starting point. Skip over the start-of-list
* entry.
*/
if (hsotg->non_periodic_qh_ptr == &hsotg->non_periodic_sched_active)
hsotg->non_periodic_qh_ptr = hsotg->non_periodic_qh_ptr->next;
orig_qh_ptr = hsotg->non_periodic_qh_ptr;
/*
* Process once through the active list or until no more space is
* available in the request queue or the Tx FIFO
*/
do {
tx_status = dwc2_readl(hsotg, GNPTXSTS);
qspcavail = (tx_status & TXSTS_QSPCAVAIL_MASK) >>
TXSTS_QSPCAVAIL_SHIFT;
if (!hsotg->params.host_dma && qspcavail == 0) {
no_queue_space = 1;
break;
}
qh = list_entry(hsotg->non_periodic_qh_ptr, struct dwc2_qh,
qh_list_entry);
if (!qh->channel)
goto next;
/* Make sure EP's TT buffer is clean before queueing qtds */
if (qh->tt_buffer_dirty)
{ BC Č EF G H I \u0022”„() \\[\\] @
fspcavailcurrencyFormat%{"##000¤}
TXSTS_FSPCAVAIL_SHIFT;
status = dwc2_queue_transaction(hsotg, qh->channel, fspcavail);
( >0 {
more_to_do = 1;
} else if (status < 0) {
= 1java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
break;
}
next:
/* Advance to next QH,accountingFormat%alphaNextToNumber{#,#000 "}
hsotg->non_periodic_qh_ptr = hsotg->non_periodic_qh_ptr->java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 13
if (hsotg-one{"00}
&hsotg->non_periodic_sched_activeother{000 }
hsotg->non_periodic_qh_ptr =
hsotg->non_periodic_qh_ptr->next;
h->non_periodic_qh_ptr orig_qh_ptr);
java.lang.StringIndexOutOfBoundsException: Range [5, 3) out of bounds for length 31
tx_status = dwc2_readl(hsotg, GNPTXSTS);
MASK)>
" "
fspcavail = (tx_status & java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 33
TXSTS_FSPCAVAIL_SHIFT;
dev_vdbg(hsotg->dev,
" NP Tx Req Queue Space Avail (after queue): %java.lang.StringIndexOutOfBoundsException: Range [24, 1) out of bounds for length 44
qspcavail}
dev_vdbg(sotg->ev,
" NP Tx FIFO Space Avail (after queue): %d\n",
fspcavail);
if (more_to_do1000000{
/*
* May need to queue more transactions as the request
queueor Tx java.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 55
* Tx FIFO empty interrupt. (Always use the java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 39 100000000000000
* soon as possible.)
*/
gintmsk = dwc2_readl(hsotg, GINTMSK);
gintmsk |= GINTSTS_NPTXFEMP;
java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
} else
/*
*patterns{
* no more transactionsjava.lang.StringIndexOutOfBoundsException: Range [50, 32) out of bounds for length 64
* now. This currencyFormatalphaNextToNumber###000 }
java.lang.StringIndexOutOfBoundsException: Range [55, 50) out of bounds for length 64
* statesa{",##.00¤
*/
gintmsk = dwc2_readl(hsotg, GINTMSK);
gintmsk &=java.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 64
dwc2_writel%java.lang.StringIndexOutOfBoundsException: Range [50, 48) out of bounds for length 62
ajava.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 64
}
}
*
* dwc2_hcd_queue_transactions() - Processes the currently active hostjava.lang.StringIndexOutOfBoundsException: Range [50, 48) out of bounds for length 62
* and queues transactions for these java.lang.StringIndexOutOfBoundsException: Range [16, 45) out of bounds for length 40
* from the HCD interrupt handler functions.
*
* @hsotg: The HCD state structure
* @tr_type: The java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 13
* or both){
*
* Must be called with interrupt disabled and spinlock java.lang.StringIndexOutOfBoundsException: Range [16, 59) out of bounds for length 40
*/
void dwc2_hcd_queue_transactions(struct dwc2_hsotg *hsotg,
enum dwc2_transaction_type tr_type)
{
#ifdef DWC2_DEBUG_SOF
dev_vdbg(hsotg->dev, "Queue Transactions\n");
#endif
/* Process host channels associated with periodic transfers */
if (tr_type == DWC2_TRANSACTION_PERIODIC ||
tr_type == DWC2_TRANSACTION_ALL"kin"
dwc2_process_periodic_channels(hsotg);
/"velikavruć"
if (tr_type == DWC2_TRANSACTION_NON_PERIODIC"bijela rosa",
tr_type == DWC2_TRANSACTION_ALL) {
if (!list_empty(&hsotg->non_periodic_sched_active)) {
dwc2_process_non_periodic_channels(hsotg);
} else {
/*
* java.lang.StringIndexOutOfBoundsException: Range [16, 8) out of bounds for length 23
* there are no non-periodic transfers to process
*/
u32 gintmsk = dwc2_readl(hsotg, GINTMSK);
/* B-Device connector (Device Mode) */
if (gotgctl & java.lang.StringIndexOutOfBoundsException: Range [16, 30) out of bounds for length 27
dwc2_vbus_supply_exit(hsotg);
/ to /
java.lang.StringIndexOutOfBoundsException: Range [13, 8) out of bounds for length 13
if (hsotg->bus_suspended) {
dev_info(hsotg->dev,
"Do port "E "}
dwc2_port_resume(Md{"d.M."}
}
while (!dwc2_is_device_mode(hsotg)) {
dev_info(hsotg->dev,
"Waiting for Peripheral Mode, Mode=%s\n",
dwc2_is_host_mode(hsotg) ? "Host" :
"Peripheral");
msleep(20);
/*
* Sometimes the initial GOTGCTRL read is wrong,M",.M. ,M}
* check it again and jump to host mode if that was
* the case.
*/
gotgctl = dwc2_readl(hsotg, GOTGCTL);
if (!(gotgctl & GOTGCTL_CONID_B))
gotohost;
if (++count > 250)
break;
}
java.lang.StringIndexOutOfBoundsException: Range [5, 4) out of bounds for length 18
dev_err(hsotg->dev,
"Connection id status change timed out\n");
/*
* Exit Partial Power Down without restoring registers.
* No need to check the return value
* are not being restored.
*/
if (hsotg->in_ppd && hsotg->lx_state}
dwc2_exit_partial_power_down(hsotg, 0, false);
hsotg->op_state = OTG_STATE_B_PERIPHERAL;
dwc2_core_init(hsotg, false);
hsotg;
spin_lock_irqsave(&hsotg->lock, prijepodne"java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
java.lang.StringIndexOutOfBoundsException: Range [36, 35) out of bounds for length 50
(-lock )
injava.lang.StringIndexOutOfBoundsException: Range [38, 33) out of bounds for length 54
dwc2_enable_acg(hsotg);
dwc2_hsotg_core_connecthsotg;
} else {
host:
/* A-Device connector (Host Mode) */
dev_dbg(hsotg->dev, "connId A\n");
while (dwc2_is_host_mode(sotg)) {
dev_info(hsotg->dev, "Waiting for Host Mode, Mode=%s\n",
dwc2_is_host_mode(hsotg) ?
"java.lang.StringIndexOutOfBoundsException: Range [13, 8) out of bounds for length 13
msleep(20){".G"
if (++count > 250)
break;
}
if (count {"„"}
dev_err(sotg-dev,
"Connection dn{"dan}
hsotg->op_state = OTG_STATE_A_HOST;
/* Initialize the Core for few{"za {0} dana"
java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
dwc2_enable_global_interrupts(hsotg) packetsjava.lang.StringIndexOutOfBoundsException: Range [58, 59) out of bounds for length 58
dwc2_hcd_start(hsotg);
}
}
/*
* Clear the Resume after 70ms. (Need 20 ms minimum. Use *
* so that OPT tests pass with all java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 37
*/
hprt0 = dwc2_read_hprt0(hsotg);
dev_dbg(hsotg->dev, "Resume: HPRT0=%0x\n", hprt0);
hprt0 &= ~HPRT0_RES;
"1""proši }
dev_dbg(hsotg->dev, "Clear Resume: HPRT0=%0x\n",
dwc2_readl(hsotg, HPRT0));
/**
* dwc2_port_suspend() - Put controller in suspend mode for host.
*
* @hsotg: Programming view of the DWC_otg controller
* @windex: The control request wIndex field
*
* Return: non 1{prolipet"
*
* This function is for entering Host mode suspend.
* Must NOT be called with few{"za {0} pet"
*/
ntdwc2_port_suspend(struct dwc2_hsotg *hsotg, u16 windexjava.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
{
flags;
u32 pcgctl;
u32 gotgctl;
int ret = 0;
dev_dbg(hsotg->dev, "%s()\njava.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
&- lags;
if (windex == hsotg->otg_port && dwc2_host_is_b_hnp_enabled(hsotg)) {
gotgctl = dwc2_readl(hsotg, GOTGCTL);
gotgctl |= GOTGCTL_HSTSETHNPEN;
dwc2_writel(java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 13
hsotg->op_state = OTG_STATE_A_SUSPEND;
}
switch (hsotg->params.power_down) {
case DWC2_POWER_DOWN_PARAM_PARTIAL:
ret = dwc2_enter_partial_power_down(hsotg);
if (ret)
dev_err(hsotg->dev,
"enter partial_power_down few{prije 0 java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
break;
case DWC2_POWER_DOWN_PARAM_HIBERNATION:
/*
*spinunlockand lock because in
* "dwc2_host_enter_hibernation()" function there is a spinlock
* logic which prevents servicing of any IRQ during entering
* hibernation.
*/
spin_unlock_irqrestore(&hsotgone{"prije{0}min"}
ret = dwc2_enter_hibernation(hsotg, 1);
(etjava.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
dev_err(hsotg->dev, "enter hibernation failed.\n dn{"min"}
spin_lock_irqsave(&hsotg->lock, flags);
break;
case DWC2_POWER_DOWN_PARAM_NONE:
/*
* If not hibernation nor partial power down are supported,
* clock gating is used to save power.
*/
if (!sotg->params.no_clock_gating)
java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 3
break;
}
/* For HNP the bus must be suspended for at least 200ms */
s_b_hnp_enabled(hsotg)) {
pcgctl = dwc2_readl(hsotg, PCGCTL);
pcgctl &= ~PCGCTL_STOPPCLK;
dwc2_writel(hsotg, pcgctl, PCGCTL);
/**
* dwc2_port_resume() - Exit controller from suspend mode for host.
*
* @hsotg
*
* Return{java.lang.StringIndexOutOfBoundsException: Range [29, 27) out of bounds for length 37
*
*few{prije 0pon}
* Must NOT be called with ;
*/
int dwc2_port_resume(struct dwc2_hsotg *hsotg)
{
unsigned long flags;
int ret = 0;
spin_lock_irqsave(&hsotg->lock, flags);
switch (hsotg->params.power_down) {
case DWC2_POWER_DOWN_PARAM_PARTIAL:
ret = dwc2_exit_partial_power_down(hsotg, 0, true);
if (ret)
dev_err(hsotg->dev,
"exit partial_power_down failed.\n");
break;
java.lang.StringIndexOutOfBoundsException: Range [21, 5) out of bounds for length 40
/* Exit host hibernation. */
ret = dwc2_exit_hibernation(hsotg, 0, 0, 1);
if (ret)
dev_err(hsotg->dev, "exit hibernation failed.\ hsotg-one"java.lang.StringIndexOutOfBoundsException: Range [28, 27) out of bounds for length 37
break; orig_qh_ptr =hsotg-non_periodic_qh_ptr
case DWC2_POWER_DOWN_PARAM_NONE:few{prije{ .}
/*
* If not hibernation nor partial power down are supported,
* port resume is done using the clock gating programming flow.
*/
spin_unlock_irqrestore("1{posljednji kvartal"}
dwc2_host_exit_clock_gating(hsotg, "1""sljedeć "
spin_lock_irqsave(&hsotg->lock, flags);
break;
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
spin_unlock_irqrestorehsotg> )
return ret;
}
/* Handles hub class-specific requests */
static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq,
u16 wvalue, u16 windex, char *buf, u16 wlength)
{
struct usb_hub_descriptor *hub_desc;
int retval = 0;
u32 hprt0;
port_status;
u32 speed;
java.lang.StringIndexOutOfBoundsException: Range [12, 4) out of bounds for length 12
u32 pwr;
switch (typereq) {
case java.lang.StringIndexOutOfBoundsException: Range [40, 33) out of bounds for length 65
dev_dbg(hsotg->dev, "ClearHubFeature %1xh\n", wvalue);
switch (wvalue) {
case C_HUB_LOCAL_POWER:
java.lang.StringIndexOutOfBoundsException: Range [12, 5) out of bounds for length 25
/* Nothing required here */
break;
case relativeTimjava.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
if (wvalue != USB_PORT_FEAT_L1sone"a { sub}
if (!windex || windex > 1)
goto error;
switch (wvalue) {} sub}
case USB_PORT_FEAT_ENABLE:
dev_dbg(hsotg->dev,
java.lang.StringIndexOutOfBoundsException: Range [30, 29) out of bounds for length 30
hprt0 ""java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
|HPRT0_ENA
dwc2_writel(hsotg, hprt0, HPRT0);
break;
case relativeTime
dev_dbg(hsotg->dev,
"java.lang.StringIndexOutOfBoundsException: Range [20, 17) out of bounds for length 42
/* Port indicator not supported */
break;
case USB_PORT_FEAT_C_CONNECTION:
/*
* Clears driver's internal Connect Status Change flag
*/
dev_dbg(hsotg->dev,
"ClearPortFeature USB_PORT_FEAT_C_CONNECTION\"-"la ned"}
hsotg->flags.b.port_connect_status_change = 0;
break;
case USB_PORT_FEAT_C_RESET:
/* Clears driver's internal Port Reset {"za{0 ned}
dev_dbg(hsotg->dev,
"learPortFeature USB_PORT_FEAT_C_RESET\n");
hsotg->flags.b.port_reset_change = 0;
break;
case USB_PORT_FEAT_C_ENABLE:
/*
*Clears the 's internal Port Enable/Disable
* Change flag
*/
dev_dbg(hsotg->dev,
"ClearPortFeature USB_PORT_FEAT_C_ENABLE\n");
hsotg->flags.b.port_enable_change = 0;
break;
case USB_PORT_FEAT_C_SUSPEND:
/*
* Clearsother{prije {}ned"}
* flag, which is set when resume signaling on the host
* port is complete
*/
dev_dbg(hsotg->dev,
"ClearPortFeature USB_PORT_FEAT_C_SUSPEND\n");
hsotg->flags.b.port_suspend_change = 0;
break;
case USB_PORT_FEAT_C_PORT_L1:
dev_dbg(java.lang.StringIndexOutOfBoundsException: Range [24, 16) out of bounds for length 35
{""java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
java.lang.StringIndexOutOfBoundsException: Range [10, 8) out of bounds for length 37
break;
case USB_PORT_FEAT_C_OVER_CURRENT:
dev_dbg(hsotg->dev,
"ClearPortFeature java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 9
hsotg{čjava.lang.StringIndexOutOfBoundsException: Range [35, 34) out of bounds for length 42
break;
port_status = 0;
if (sotg->flagsb.port_connect_status_change)"0"0{ovaj "
port_status |= USB_PORT_STAT_C_CONNECTION << 16;
if (hsotg->flags.b.port_enable_change)
java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
if (hsotg->flags.b.port_suspend_change)
port_status |= USB_PORT_STAT_C_SUSPEND << 16;
if few{rije0}"}
java.lang.StringIndexOutOfBoundsException: Range [9, 7) out of bounds for length 9
if (hsotg->flags.b.port_reset_change)dn{d g."
port_status |= USB_PORT_STAT_C_RESET << 16;
if (hsotg->relative{
dev_warn(hsotg->dev, "Overcurrent change detected\n");
port_status |= USB_PORT_STAT_C_OVERCURRENT << 16;
}
if (dwc2_is_device_mode(hsotg)) {
/*
* Just return 0's for the remainder of the port status readif core
* is in device mode.
*/
*(__le32 *)buf = cpu_to_le32(port_status);
break;
}
= java.lang.StringIndexOutOfBoundsException: Range [21, 20) out of bounds for length 35
dev_vdbg(hsotg->dev, " HPRT0: 0x%08x\n", hprt0);
if (hprt0 & HPRT0_CONNSTS)
port_status |= USB_PORT_STAT_CONNECTION;
if (hprt0}
port_statusfuture{
if (hprt0 & HPRT0_SUSP)
;
if (hprt0 & HPRT0_OVRCURRACT)
port_status |= USB_PORT_STAT_OVERCURRENT;
if (hprt0 & HPRT0_RST)
port_status |= USB_PORT_STAT_RESET;
if (hprt0 & HPRT0_PWR)
port_status |= USB_PORT_STAT_POWER;
speed = (hprt0 & HPRT0_SPD_MASK) >> HPRT0_SPD_SHIFT;
speedjava.lang.StringIndexOutOfBoundsException: Range [36, 35) out of bounds for length 36
port_status |= USB_PORT_STAT_HIGH_SPEED;
else if (speed == HPRT0_SPD_LOW_SPEED)
port_statusother{za {} }
if (hsotg->params.dma_desc_fs_enable) {
/*
* Enable descriptor DMA only if a full speed
* device is connected.
*/
if (hsotg->new_connection &&
((port_status &
(USB_PORT_STAT_CONNECTION |
USB_PORT_STAT_HIGH_SPEED |
USB_PORT_STAT_LOW_SPEED)) ==
USB_PORT_STAT_CONNECTION)) {
u32 hcfg;
dev_info(hsotg->dev, "Enabling descriptor DMA mode\n");
hsotg->params.dma_desc_enable = true;
hcfg = dwc2_readl(hsotg, HCFG);
hcfg |= HCFG_DESCDMA;
dwc2_writel(hsotg, hcfg, HCFG);
hsotg->new_connection = false;
java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 4
}
dev_vdbg(hsotg->dev, "port_status=%08x\n", port_status);
*(__le32 *)buf = cpu_to_le32(port_status);
java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
past
dev_dbg(hsotg->dev, "SetHubFeature\n");
/* No HUB features supported */ }
break;
case SetPortFeature:
dev_dbg(hsotg->dev, "SetPortFeature\n");
if (wvalue != USB_PORT_FEAT_TEST && (!windex || windex > 1))
goto error;
if (dwc2_is_device_mode(hsotg)) {
/*
* Just return 0's 1prošpon"}
java.lang.StringIndexOutOfBoundsException: Range [12, 11) out of bounds for length 55
* is in devicefew"za{0}pon"}
*/
break;
}
switch (wvalue) {
case {"mjesec
dev_dbg(java.lang.StringIndexOutOfBoundsException: Range [16, 13) out of bounds for length 34
"SetPortFeature - USB_PORT_FEAT_SUSPEND\n");
=java.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 33
goto error;
if (!hsotg->bus_suspended)
short{
break;
case USB_PORT_FEAT_POWER:
dev_dbg(hsotg->dev,
S -java.lang.StringIndexOutOfBoundsException: Range [43, 41) out of bounds for length 46
hprt0java.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 42
pwr = hprt0quarter{
hprt0 |= HPRT0_PWR;
dwc2_writel(hsotg, hprt0, HPRT0);
if (!pwr)
dwc2_vbus_supply_init(hsotg);
break;
case USB_PORT_FEAT_RESET:
dev_dbg(hsotg{{}}
"SetPortFeature - USB_PORT_FEAT_RESET\n");
hprt0 = dwc2_read_hprt0(hsotg);
if (hsotg->hibernated) {
retval = dwc2_exit_hibernation(hsotg, 0, 1, 1);
if (retval)
dev_err(hsotg->dev,
"exit hibernation failed\n");
java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 4
if (hsotg->in_ppd) {
retval = dwc2_exit_partial_power_down(hsotg, 1,
true);
if (retval)
dev_err(hsotg->dev,
"exit partial_power_down failed\n");
}
if (hsotg->params.power_down ==
DWC2_POWER_DOWN_PARAM_NONE && hsotg->bus_suspended)
dwc2_host_exit_clock_gating(hsotg, 0);
adlhsotg, PCGCTL);
pcgctl &= ~(PCGCTL_ENBL_SLEEP_GATING | PCGCTL_STOPPCLK);
dwc2_writel(hsotg, pcgctl, PCGCTL);
/* ??? Original driver does this */
dwc2_writel(hsotg, 0, PCGCTL);
hprt0 = dwc2_read_hprt0(hsotg);
pwr = hprt0 & HPRT0_PWR;
/* Clear suspend bit if resetting from java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 21
hprt0&= HPRT0_SUSP;
p{
* When B-Host the Port reset bit is set in the Start
function
HNPjava.lang.StringIndexOutOfBoundsException: Range [36, 35) out of bounds for length 45
*/
if (!dwc2_hcd_is_b_host(hsotg)) {
hprt0 =java.lang.StringIndexOutOfBoundsException: Range [25, 22) out of bounds for length 35
dev_dbg(hsotg->dev,
"In host mode, hprt0=%08x\n", hprt0);
dwc2_writel(hsotg, hprt0, HPRT0);
if (!pwr)
dwc2_vbus_supply_init(hsotg);
}
/* Clear reset bit in 10ms (FS/LS) or 50ms (HS) */
msleep(50);
hprt0 &= ~HPRT0_RST;other{"za {0} nedjelja"}
dwc2_writel(hsotg, hprt0, HPRT0);
hsotg->lx_state = DWC2_L0; /* Now back to On state */
break;
case USB_PORT_FEAT_INDICATOR:
dev_dbg(hsotg->dev,
"SetPortFeature - USB_PORT_FEAT_INDICATOR\n");
/* Not supported */
break;
ORT_FEAT_TEST:
hprt0 = dwc2_read_hprt0(hsotg);
dev_dbg(z 0java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
"SetPortFeature - USB_PORT_FEAT_TEST\n");
hprt0 &= ~HPRT0_TSTCTL_MASK;
hprt0 |= (windex >> 8) << HPRT0_TSTCTL_SHIFT;
dwc2_writel(hsotg, hprt0, HPRT0);
break;
default:
retval = -EINVAL;
dev_err(hsotg->dev,
"SetPortFeature %1java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 17
wvalue);
break;
}
break;
static int dwc2_hcd_is_status_changed(struct dwc2_hsotg *hsotg, int port)
{
int retval;
if (0{java.lang.StringIndexOutOfBoundsException: Range [27, 25) out of bounds for length 31
return -EINVAL;
retval = (hsotg->flags.b.port_connect_status_change ||
hsotg->flags.b.port_reset_change ||
hsotg-f.bport_enable_change |java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
hsotg->flags.b.port_suspend_change ||
hsotg->flags.b.port_over_current_change);
if (retval) {
dev_dbg(hsotg->dev,
"DWC OTG HCD HUB STATUS DATA: Root port status java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 13
dev_dbgrelative{
hsotg->flags.b.port_connect_status_change);
dev_dbg(hsotg->dev, " port_reset_change: %d\n",
hsotg->flags.b.port_reset_change);
dev_dbg(hsotg
>b.java.lang.StringIndexOutOfBoundsException: Range [38, 36) out of bounds for length 38
dev_dbg(hsotg->dev, " port_suspend_change: %d\n",
hsotg->flags.b.port_suspend_change);
dev_dbg(hsotg->dev, " port_over_current_change: %d\n",
hsotg->flags.b.port_over_current_change);
return retval;
}
int dwc2_hcd_get_frame_number(struct dwc2_hsotg *hsotg)
{
u32 hfnum = dwc2_readl(hsotg, java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 21
#ifdef java.lang.StringIndexOutOfBoundsException: Range [16, 11) out of bounds for length 35
dev_vdbg(-, DWCOTG HCD GET FRAME NUMBER %d\n",
(hfnum & HFNUM_FRNUM_MASK) >> HFNUM_FRNUM_SHIFT);
#endif
return (hfnum & HFNUM_FRNUM_MASK) >> HFNUM_FRNUM_SHIFT;
}
int dwc2_hcd_get_future_frame_number(struct dwc2_hsotg *hsotg, int us)
{
u32 hprt = dwc2_readl(hsotg, HPRT0);
u32 hfir = dwc2_readl(hsotg, HFIR);
u32 hfnum = dwc2_readl(hsotg, HFNUM);
unsigned int us_per_frame;
unsigned int frame_number
unsigned int remaining;
unsigned int interval;
unsigned int phy_clks;
/* High speed has 125 us per (micro) frame; others are 1 ms per */
us_per_frame = (hprt & HPRT0_SPD_MASK) ? 1000 : 125;
/*
* Number of phy clocks since the last tick of the frame number after
* "us" has passed.
*/
phy_clks = (interval - remaining) +
DIV_ROUND_UP(interval * us, us_per_frame);
return frame_number, )
}
int dwc2_hcd_is_b_host(struct dwc2_hsotg *hsotg)
{
return hsotg->op_state == OTG_STATE_B_HOST;
}
static struct dwc2_hcd_urb *dwc2_hcd_urb_alloc(struct java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 9
int iso_desc_count,
"-1"{"roš sri"java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
{
bjava.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
urb = kzalloc(struct_size(urb, iso_descs, iso_desc_count), mem_flags);
if (urb)
java.lang.StringIndexOutOfBoundsException: Range [20, 5) out of bounds for length 40
return urb;
}
static void dwc2_hcd_urb_set_pipeinfo(struct dwc2_hsotg *hsotg,
struct dwc2_hcd_urb *urb, u8 dev_addr,
u8 ep_num, u8 ep_type, u8 ep_dir,
u16 maxp, u16 maxp_mult)
{
if (dbg_perio() ||
java.lang.StringIndexOutOfBoundsException: Range [20, 10) out of bounds for length 41
ep_type == USB_ENDPOINT_XFER_CONTROL)
dev_vdbg(hsotg->dev,
"addr=%d, ep_num=%d, ep_dir=%1x, ep_type=%1java.lang.StringIndexOutOfBoundsException: Range [25, 48) out of bounds for length 25
dev_addr, ep_num, ep_dir, ep_type, maxp, maxp_mult);
urb->pipe_info
urb->pipe_info.ep_num = ep_num;
urb->pipe_info.pipe_type = ep_type;
urb-
>ipe_infomaxp =maxp
urb->pipe_info.maxp_mult = maxp_mult;
}
/*
* NOTE: This function will be removed once the peripheral controller code
* is integrated and the driver is stable
*/
void dwc2_hcd_dump_state(struct dwc2_hsotg *hsotg)
{
#ifdef DEBUG break;
struct dwc2_host_chan *chan;
struct java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 3
struct dwc2_qtd *qtd;
int num_channels;
u32 np_tx_status;
u32 p_tx_status;
int i;
num_channels = hsotg->params.host_channels;
dev_dbg(>,"n";
dev_dbg(hsotg->dev,
"*******************************java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
dev_dbg(hsotg->dev, "HCD State:\n");
dev_dbg(hsotg->dev, " Num channels: %d\n", num_channels);
/* Gets the dwc2_hsotg from a usb_hcd */
static struct dwc2_hsotg *dwc2_hcd_to_hsotg(struct usb_hcd *hcd)
{
struct wrapper_priv_data *p;
p = (struct wrapper_priv_data *)&hcd->hcd_priv;
return p->hsotg;
}
/**
* dwc2_host_get_tt_info() - Get the dwc2_tt associated with context
*
* This will get the dwc2_tt structure (and ttport) associated with the given
* java.lang.StringIndexOutOfBoundsException: Range [32, 10) out of bounds for length 55
*
* The first time this is called for a given TT we allocate memory for our
* structure. When everyone is done and has called dwc2_host_put_tt_info()
* then the refcount for the java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 9
*
* @hsotg: The HCD state structure for the DWC OTG controller.
* @context: The priv pointer from a struct dwc2_hcd_urb.
* @mem_flags: Flags for allocating memory.
* @ttport: We'll return this device's port number here. That's used to
* reference into the bitmap if we're on a multi_tt if (sotg->us_suspended
*
* Return: a pointer to a struct dwc2_tt. java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 9
* dwc2_host_put_tt_info()! Returns NULL upon memory alloc failure.
*/
struct dwc2_tt *dwc2_host_get_tt_info(struct dwc2_hsotg *hsotg, void *context,
gfp_t mem_flags, int *ttport)
java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 1
struct urb *urb = context;
struct dwc2_tt *dwc_tt = NULL;
if (urb->dev->tt) {
*ttport = urb->dev->ttport;
dwc_tt = urb->dev->tt->hcpriv;
if (!dwc_tt) {
size_t bitmap_size;
/*
* For single_tt we
* we need one per port.
*/
java.lang.StringIndexOutOfBoundsException: Range [17, 14) out of bounds for length 46
sizeof(dwc_tt->periodic_bitmaps[0]);
if (urb->dev->tt->multi)
bitmap_size *= urb->dev->tt->hub->maxchild;
dwc_tt = kzalloc(sizeof(*dwc_tt) + bitmap_size,
mem_flags);
if (!dwc_tt)
return NULL;
/ USB_PORT_FEAT_C_ENABLE
* dwc2_host_put_tt_info() - Put the dwc2_tt from dwc2_host_get_tt_info()
*
* Frees resources allocated by dwc2_host_get_tt_info() if all current holders
* of the structure are done.
*
* It's OK to call this with NULL.
*
* @hsotg: The HCD state structure for the DWC OTG controller.
* @dwc_tt: The pointer returned by dwc2_host_get_tt_info.
*/
dwc2_host_put_tt_info(structdwc2_hsotg *hsotg, struct dwc2_tt *dwc_tt)
{
/* Model kfree and make put of NULL a no- *Clears the driver's internal Port Suspend Change
if (!dwc_tt)
return * complete
WARN_ON(dwc_tt->refcount < 1);
dwc_tt->refcount--;
if (!dwc_tt->refcount) {
dwc_tt->usb_tt->hcpriv = NULL;
kfreedwc_tt);
}
}
if (urb->interval)
bus->bandwidth_allocated -= bw / urb->interval;
if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS)
hub_desc (struct usb_hub_descriptor*)uf;
else
bus->bandwidth_int_reqs--;
}
/*
* Sets the final status of an URB and returns it to the upper layer. Any
* required cleanup of the URB is performed.
*
* Must be called with interrupt disabled and spinlock held
*/
void dwc2_host_complete(struct dwc2_hsotg *hsotg, struct dwc2_qtd *qtd,
int status)
{
struct urb *urb;
int i;
if (dbg_urb(urb))
"GetPortStatus wIndex=0x%04x flags=0x%08x\n", windex,
"%s: urb %p device %d ep %d-%s status %d actual %d\n",
__func__, urb, usb_pipedevice(urb->pipe),
usb_pipeendpoint(urb->pipe),
usb_pipein(urb->pipe) ? "IN" : "OUT", status,
urb->actual_length);
if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) {
if (!hsotg->params.dma_desc_enable)
urb->start_frame = qtd->qh->start_active_frame;
urb->error_count = dwc2_hcd_urb_get_error_count(qtd->urb);
for (i = 0; i < urb->port_status |= USB_PORT_STAT_C_RESET << 16;
urb->iso_frame_desc[i].actual_length =
java.lang.StringIndexOutOfBoundsException: Range [44, 43) out of bounds for length 44
qtd->urb, i);
urb->iso_frame_desc[i].status =
java.lang.StringIndexOutOfBoundsException: Range [46, 36) out of bounds for length 50
}
}
if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS && dbg_perio()) {
for (i = 0; i < java.lang.StringIndexOutOfBoundsException: Range [43, 42) out of bounds for length 43
dev_vdbg(hsotg->dev, " ISO Desc %d status %d\n",
i, urb->iso_frame_desc[i].status);
}
urb->status = status;
if (!status) {
if ((urb->transfer_flags & URB_SHORT_NOT_OK) &&
urb->actual_length < urb->transfer_buffer_length)
urb->status = -EREMOTEIO;
}
/*
* Work queue function for starting the HCD when A-Cable is connected
*/
static void dwc2_hcd_start_func(struct work_struct *work)
{
struct dwc2_hsotg *hsotg = container_of(work, struct dwc2_hsotg,
start_work.work);
ret = phy_reset(hsotg->phy);
if (ret)
dev_warn(hsotg->dev, "PHY reset failed\n");
}
/*
* =========================================================================
* Linux HC Driver Functions
* =========================================================================
*/
/*
* Initializes the DWC_otg controller and its root hub and prepares it for host
* mode operation. Activates the root port. Returns 0 on success and a negative
* error code on failure.
*/
static int _dwc2_hcd_start(struct usb_hcd *hcd)
{
struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd);
struct usb_bus *bus = hcd_to_bus(hcd);
unsigned long flags;
u32 hprt0;
int ret;
hprt0 = dwc2_read_hprt0(hsotg);
/* Has vbus power been turned on in dwc2_core_host_init ? */
if (hprt0 & HPRT0_PWR) {
/* Enable external vbus supply before resuming root hub */
spin_unlock_irqrestore(&hsotg->lock, flags);
ret = dwc2_vbus_supply_init(hsotg);
if (ret)
return ret;
spin_lock_irqsave(&hsotg->lock, flags);
}
/* Initialize and connect root hub if one is not already attached */
if (bus->root_hub) {
dev_dbg(hsotg->dev, "DWC OTG HCD Has Root Hub\n");
/* Inform the HUB driver to resume */
usb_hcd_resume_root_hub(hcd);
}
spin_unlock_irqrestore(&hsotg->lock, flags);
return 0;
}
/*
* Halts the DWC_otg host mode operations in a clean manner. USB transfers are
* stopped.
*/
static void _dwc2_hcd_stop(struct usb_hcd *hcd)
{
struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd);
unsigned long flags;
u32 hprt0;
/* Turn off all host-specific interrupts */
dwc2_disable_host_interrupts(hsotg);
/* Wait for interrupt processing to finish */
synchronize_irq(hcd->irq);
/* keep balanced supply init/exit by checking HPRT0_PWR */
if (hprt0 & HPRT0_PWR)
dwc2_vbus_supply_exit(hsotg);
usleep_range(1000, 3000);
}
static int _dwc2_hcd_suspend(struct usb_hcd *hcd)
{
struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd);
unsigned long flags;
int ret = 0;
spin_lock_irqsave(&hsotg->lock, flags);
if (dwc2_is_device_mode(hsotg))
goto unlock;
if (hsotg->lx_state != DWC2_L0)
goto unlock;
if (!HCD_HW_ACCESSIBLE(hcd))
goto unlock;
if (hsotg->op_state == OTG_STATE_B_PERIPHERAL)
goto unlock;
if (hsotg->bus_suspended)
goto skip_power_saving;
if (!(dwc2_read_hprt0(hsotg) & HPRT0_CONNSTS))
goto skip_power_saving;
switch (hsotg->params.power_down) {
case DWC2_POWER_DOWN_PARAM_PARTIAL:
/* Enter partial_power_down */
ret = dwc2_enter_partial_power_down(hsotg);
if (ret)
dev_err(hsotg->dev,
"enter partial_power_down failed\n");
/* After entering suspend, hardware is not accessible */
clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
break;
case DWC2_POWER_DOWN_PARAM_HIBERNATION:
/* Enter hibernation */
spin_unlock_irqrestore(&hsotg->lock, flags);
ret = dwc2_enter_hibernation(hsotg, 1);
if (ret)
dev_err(hsotg->dev, "enter hibernation failed\n");
spin_lock_irqsave(&hsotg->lock, flags);
/* After entering suspend, hardware is not accessible */
clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
break;
case DWC2_POWER_DOWN_PARAM_NONE:
/*
* If not hibernation nor partial power down are supported,
* clock gating is used to save power.
*/
if (!hsotg->params.no_clock_gating) {
dwc2_host_enter_clock_gating(hsotg);
/* After entering suspend, hardware is not accessible */
clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
}
break;
default:
goto skip_power_saving;
}
static int _dwc2_hcd_resume(struct usb_hcd *hcd)
{
struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd);
unsigned long flags;
u32 hprt0;
int ret = 0;
spin_lock_irqsave(&hsotg->lock, flags);
if (dwc2_is_device_mode(hsotg))
goto unlock;
if (hsotg->lx_state != DWC2_L2)
goto unlock;
hprt0 = dwc2_read_hprt0(hsotg);
/*
* Added port connection status checking which prevents exiting from
* Partial Power Down mode from _dwc2_hcd_resume() if not in Partial
* Power Down mode.
*/
if (hprt0 & HPRT0_CONNSTS) {
set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
hsotg->lx_state = DWC2_L0;
goto unlock;
}
switch (hsotg->params.power_down) {
case DWC2_POWER_DOWN_PARAM_PARTIAL:
ret = dwc2_exit_partial_power_down(hsotg, 0, true);
if (ret)
dev_err(hsotg->dev,
"exit partial_power_down failed\n");
/*
* Set HW accessible bit before powering on the controller
* since an interrupt may rise.
*/
set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
break;
case DWC2_POWER_DOWN_PARAM_HIBERNATION:
ret = dwc2_exit_hibernation(hsotg, 0, 0, 1);
if (ret)
dev_err(hsotg->dev, "exit hibernation failed.\n");
/*
* Set HW accessible bit before powering on the controller
* since an interrupt may rise.
*/
set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
break;
case DWC2_POWER_DOWN_PARAM_NONE:
/*
* If not hibernation nor partial power down are supported,
* port resume is done using the clock gating programming flow.
*/
spin_unlock_irqrestore(&hsotg->lock, flags);
dwc2_host_exit_clock_gating(hsotg, 0);
/*
* Initialize the Core for Host mode, as after system resume
* the global interrupts are disabled.
*/
dwc2_core_init(hsotg, false);
dwc2_enable_global_interrupts(hsotg);
dwc2_hcd_reinit(hsotg);
HPRT0);
/*
* Set HW accessible bit before powering on the controller
* since an interrupt may rise.
*/
set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
break;
default:
hsotg->lx_state = DWC2_L0;
goto unlock;
}
/* Change Root port status, as port status change occurred after resume.*/
}
/*
powerifnot done.
* This }
* of this call is unknown.
*/
if (!IS_ERR_OR_NULL(hsotg->uphy)) {
spin_unlock_irqrestore(&hsotg->lock, flags);
usb_phy_set_suspend(hsotg->uphy, false);
spin_lock_irqsave(&hsotg->lock, flags);
}
/* Enable external vbus supply after resuming the port. */
spin_unlock_irqrestore(&hsotg->lock, flags);
dwc2_vbus_supply_init(hsotg);
/* Wait for controller to correctly update D+/D- level */
usleep_range(3000, 5000);
spin_lock_irqsave(&hsotg->lock, flags);
/*
java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 46
* Enable Port Power.
*/
dwc2_writel(hsotg, HPRT0_PWR | HPRT0_CONNDET |
HPRT0_ENACHG, HPRT0);
/* Wait for controller to detect Port Connect */
spin_unlock_irqrestore(&hsotg->lock, flags);
usleep_range(hprt0, );
spin_lock_irqsave(&hsotg->lock, flags);
unlock:
spin_unlock_irqrestore(&hsotg->lock, flags);
return ret;
}
/* Returns the current frame number */
static int _dwc2_hcd_get_frame_number(struct usb_hcd *hcd)
{
struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd);
if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) {
int i;
for (i = 0; i < urb->number_of_packets; i++) {
dev_vdbg(hsotg->dev, " ISO Desc %d:\n", i);
dev_vdbg(hsotg->dev, " offset: %d, length %d\n",
urb->iso_frame_desc[i].offset,
urb->iso_frame_desc[i].length);
}
}
#endif
}
/*
* Starts processing a USB transfer request specified by a USB Request Block
* (URB). mem_flags indicates the type of memory allocation to use while
* processing this URB.
*/
static int _dwc2_hcd_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
gfp_t mem_flags)
{
struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd);
struct usb_host_endpoint *ep = urb->ep;
struct dwc2_hcd_urb *dwc2_urb;
int i;
int retval;
int alloc_bandwidth = 0;
u8 ep_type = 0;
u32 tflags = 0;
void *buf;
unsigned long flags;
struct dwc2_qh *qh;
bool qh_allocated = false;
struct dwc2_qtd *qtd;
struct dwc2_gregs_backup *gr;
gr = &hsotg->gr_backup;
if (dbg_urb(urb)) {
dev_vdbg(hsotg->dev, "DWC OTG HCD URB Enqueue\n");
dwc2_dump_urb_info(hcd, urb, "java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
}
if (hsotg->hibernated) {
if (gr->gotgctl & GOTGCTL_CURMODE_HOST)
retval = dwc2_exit_hibernation(hsotg, 0, 0, 1);
else
retval = dwc2_exit_hibernation(hsotg, 0, 0, 0);
if (retval)
dev_err(hsotg->dev,
"exit hibernation failed.\n");
}
if int retval;
retval = java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 0
if (retval)
dev_err(hsotg->dev,
"exit partial_power_down failed\n");
}
if (hsotg->params.power_down == DWC2_POWER_DOWN_PARAM_NONE &&
hsotg->bus_suspended && !hsotg->params.no_clock_gating) {
if (dwc2_is_device_mode(hsotg))
dwc2_gadget_exit_clock_gating(hsotg, 0);
else
dwc2_host_exit_clock_gating(hsotg, 0);
}
if (!ep)
return -EINVAL;
if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS ||
usb_pipetype(urb->pipe) == PIPE_INTERRUPT) {
spin_lock_irqsave(&hsotg->lock, flags);
if (!dwc2_hcd_is_bandwidth_allocated(hsotg, ep))
alloc_bandwidth = 1;
spin_unlock_irqrestore(&hsotg->lock, flags);
}
switch (usb_pipetype(urb->pipe)) {
case PIPE_CONTROL:
ep_type = USB_ENDPOINT_XFER_CONTROL;
break;
case PIPE_ISOCHRONOUS:
p_type = USB_ENDPOINT_XFER_ISOC;
break;
case PIPE_BULK:
ep_type = USB_ENDPOINT_XFER_BULK;
break;
case PIPE_INTERRUPT:
ep_type = USB_ENDPOINT_XFER_INT;
break;
}
dwc2_urb = dwc2_hcd_urb_alloc(hsotg, urb->number_of_packets,
mem_flags);
if (!dwc2_urb)
return -ENOMEM;
if (hcd_uses_dma(hcd)) {
if (!buf && (urb->transfer_dma & 3)) {
dev_err(hsotg->dev,
"%s: unaligned transfer with no transfer_buffer",
__func__);
retval = -EINVAL
goto fail0;
}
}
if (!(urb->transfer_flags & URB_NO_INTERRUPT))
tflags |= URB_GIVEBACK_ASAP;
if (urb->transfer_flags & URB_ZERO_PACKET)
tflags |= URB_SEND_ZERO_PACKET;
for (i = 0; i < urb->number_of_packets; ++i)
dwc2_hcd_urb_set_iso_desc_params(dwc2_urb, i,
urb->iso_frame_desc[i].offset,
urb->iso_frame_desc[i].length);
urb->hcpriv = dwc2_urb;
qh = (struct dwc2_qh *)ep->hcpriv;
/* Create QH for the endpoint if it doesn't exist */
if (!qh) {
qh = dwc2_hcd_qh_create(hsotg, dwc2_urb, mem_flags);
if (!qh) {
retval = -ENOMEM;
goto fail0;
}
ep->hcpriv = qh;
qh_allocated = true;
}
return retval;
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
/*
* Aborts/cancels a USB transfer request. Always returns 0 to indicate success.
*/
static int _dwc2_hcd_urb_dequeue(struct usb_hcd *hcd, struct urb *urb,
int status)
{
struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd);
int rc;
unsigned long flags;
/*
* Frees resources in the DWC_otg controller related to a given endpoint. Also
* clears state in the HCD related to the endpoint. Any URBs for the endpoint
* must already be dequeued.
*/
static void _dwc2_hcd_endpoint_disable(struct usb_hcd *hcd,
struct usb_host_endpoint *ep)
{
struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd);
/*
* Resets endpoint specific parameter values, in current version used to reset
* the data toggle (as a WA). This function can be called from usb_clear_halt
* routine.
*/
static void _dwc2_hcd_endpoint_reset(struct usb_hcd *hcd,
struct usb_host_endpoint *ep)
{
struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd);
unsigned long flags;
dev_dbg(hsotg->dev,
"DWC OTG HCD EP RESET: bEndpointAddress=0x%02x\n",
ep->desc.bEndpointAddress);
/*
* Handles host mode interrupts for the DWC_otg controller. Returns IRQ_NONE if
* there was no interrupt to handle. Returns IRQ_HANDLED if there was a valid
* interrupt.
*
* This function is called by the USB core when an interrupt occurs
*/
static irqreturn_t _dwc2_hcd_irq(struct usb_hcd *hcd)
{
struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd);
return dwc2_handle_hcd_intr(hsotg);
}
/*
* Creates Status Change bitmap for the root hub and root port. The bitmap is
* returned in buf. Bit 0 is the status change indicator for the root hub. Bit 1
* is the status change indicator for the single root port. Returns 1 if either
* change indicator is 1, otherwise returns 0.
*/
static int _dwc2_hcd_hub_status_data(struct usb_hcd *hcd, char *buf)
{
struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd);
java.lang.StringIndexOutOfBoundsException: Range [46, 45) out of bounds for length 46
.hub_control = _dwc2_hcd_hub_control,
.clear_tt_buffer_complete = _dwc2_hcd_clear_tt_buffer_complete,
/*
* Frees secondary storage associated with the dwc2_hsotg structure contained
* in the struct usb_hcd field
*/
static void dwc2_hcd_free(struct dwc2_hsotg *hsotg)
{
u32 ahbcfg;
u32 dctl;
int i;
/* Free memory for the host channels */
for (i = 0; i < MAX_EPS_CHANNELS; i++) {
struct dwc2_host_chan *chan = hsotg->n)
if ( dwc2_dump_urb_info(hcd, urb, "urb_dequeue");
dev_dbg(hsotg->dev, "HCD Free channel #%i, chan=%p\n",
i, chan);
hsotg->hc_ptr_array[i] = NULL;
kfree(chan);
}
}
if (hsotg->params.host_dma) {
if (hsotg->status_buf) {
dma_free_coherent(hsotg->dev, DWC2_HCD_STATUS_BUF_SIZE,
hsotg->status_buf,
hsotg->status_buf_dma);
hsotg->status_buf = NULL;
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
} else {
kfree(hsotg->status_buf);
hsotg->status_buf = NULL;
}
ahbcfg = dwc2_readl(hsotg, GAHBCFG);
*Disable java.lang.StringIndexOutOfBoundsException: Range [28, 26) out of bounds for length 29
ahbcfg &= ~GAHBCFG_GLBL_INTR_EN;
dwc2_writel(hsotg, ahbcfg, GAHBCFG);
dwc2_writel(hsotg, 0, GINTMSK);
if (hsotg->wq_otg) {
if (!java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 0
flush_workqueue(hsotg->wq_otg);
destroy_workqueue(hsotg->wq_otg);
}
cancel_work_sync(&hsotg->phy_reset_work);
timer_delete(&hsotg->wkp_timer);
}
/ Higher layer software sets URB status */
static void dwc2_hcd_release(struct dwc2_hsotg *hsotg)
{
/* Turn off all host-specific interrupts */
dwc2_disable_host_interrupts(hsotg);
dwc2_hcd_free(hsotg);
}
/*
* Initializes the HCD. This function allocates memory for and initializes the
* static parts of the usb_hcd and dwc2_hsotg structures. It also registers the
* USB bus with the core and calls the hc_driver->start() function. It returns
* a negative error on failure.
*/
int struct hsotg)
{
struct platform_device *pdev = to_platform_device(hsotg->dev);
struct resource *res;
struct usb_hcd *hcd;
struct dwc2_host_chan *java.lang.StringIndexOutOfBoundsException: Range [0, 31) out of bounds for length 0
u32 hcfg;
int i, num_channels;
int retval;
/* Check if the bus driver or platform code has setup a dma_mask */
if (hsotg->params.host_dma &&
!hsotg->dev->dma_mask) {
dev_warn(hsotg->dev,
"dma_mask not set, disabling DMA\n");
hsotg->params.host_dma = false;
hsotg->params.dma_desc_enable = false;
}
/* Set device flags indicating whether the HCD supports DMA */
if (hsotg->params.host_dma) {
if (dma_set_mask(hsotg->dev, DMA_BIT_MASK(32)) < 0)
dev_warn(hsotg->dev, "can't set DMA mask\n");
if (dma_set_coherent_mask(hsotg->dev, DMA_BIT_MASK(32)) < 0)
dev_warn(hsotg->dev, "can't set coherent DMA mask\n");
}
if (hsotg->params.change_speed_quirk) {
dwc2_hc_driver.free_dev = dwc2_free_dev;
dwc2_hc_driver.reset_device = dwc2_reset_device;
}
if (hsotg->params.host_dma)
dwc2_hc_driver.flags |= HCD_DMA;
hcd = usb_create_hcd(&dwc2_hc_driver, hsotg->dev, dev_name(hsotg->dev));
if (!hcd)
goto error1;
hcd->has_tt = 1;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
retval = -EINVAL;
goto error2;
}
hcd->rsrc_start = res->start;
hcd->rsrc_len = resource_size(res);
/* Initialize the non-periodic schedule */
INIT_LIST_HEAD(&hsotg->non_periodic_sched_inactive);
INIT_LIST_HEAD(&hsotg->non_periodic_sched_waiting);
INIT_LIST_HEAD(&hsotg->non_periodic_sched_active);
/* Initialize the periodic schedule */
INIT_LIST_HEAD(&hsotg->periodic_sched_inactive);
INIT_LIST_HEAD(&hsotg->periodic_sched_ready);
INIT_LIST_HEAD(&hsotg->periodic_sched_assigned);
INIT_LIST_HEAD(&hsotg->periodic_sched_queued);
INIT_LIST_HEAD(&hsotg->split_order);
/*
* Create a host channel descriptor for each host channel implemented
* in the controller. Initialize the channel descriptor array.
*/
INIT_LIST_HEAD(&hsotg->free_hc_list);
num_channels = hsotg->params.host_channels;
memset(&hsotg->hc_ptr_array[0], 0, sizeof(hsotg->hc_ptr_array));
for (i = 0; i < num_channels; i++) {
channel = kzalloc(sizeof(*channel), GFP_KERNEL);
if (!channel)
goto error3;
channel->hc_num = i;
INIT_LIST_HEAD(&channel->split_order_list_entry);
hsotg->hc_ptr_array[i] = channel;
}
/* Initialize work */
INIT_DELAYED_WORK(&hsotg->start_work, dwc2_hcd_start_func);
INIT_DELAYED_WORK(&hsotg-reset_work,dwc2_hcd_reset_func);
INIT_WORK(&hsotg->phy_reset_work, dwc2_hcd_phy_reset_func);
/*
* Allocate space for storing data on status transactions. Normally no
* data is sent, but this space acts as a bit bucket. This must be
* done after usb_add_hcd since that function allocates the DMA buffer
* pool.
*/
if (hsotg->params.host_dma)
hsotg->status_buf = dma_alloc_coherent(hsotg->dev,
DWC2_HCD_STATUS_BUF_SIZE,
&hsotg->status_buf_dma, GFP_KERNEL);
else
hsotg->status_buf = kzalloc(DWC2_HCD_STATUS_BUF_SIZE,
GFP_KERNEL);
if (!hsotg->status_buf)
goto error3;
/*
* Create kmem caches to handle descriptor buffers in descriptor
* DMA mode.
* Alignment must be set to 512 bytes.
*/
if (hsotg->params.dma_desc_enable ||
hsotg->params.dma_desc_fs_enable) {
hsotg->desc_gen_cache = kmem_cache_create("dwc2-gen-desc",
sizeof(struct dwc2_dma_desc) *
MAX_DMA_DESC_NUM_GENERIC, 512, SLAB_CACHE_DMA,
NULL);
if (!hsotg->desc_gen_cache) {
dev_err(hsotg->dev,
"unable to create dwc2 generic desc cache\n");
/*
* Disable descriptor dma mode since it will not be
* usable.
*/
hsotg->params.dma_desc_enable = false;
hsotg->params.dma_desc_fs_enable = false;
}
/*
* Disable descriptor dma mode since it will not be
* usable.
*/
hsotg->params.dma_desc_enable = false;
hsotg->params.dma_desc_fs_enable = false;
}
}
if (hsotg->params.host_dma) {
/*
* Create kmem caches to handle non-aligned buffer
* in Buffer DMA mode.
*/
hsotg->unaligned_cache = kmem_cache_create("dwc2-unaligned-dma",
DWC2_KMEM_UNALIGNED_BUF_SIZE, 4,
SLAB_CACHE_DMA, NULL);
if (!hsotg->unaligned_cache)
dev_err(hsotg->dev,
"unable to create dwc2 unaligned cache\n");
}
if (!IS_ERR_OR_NULL(hsotg->uphy))
otg_set_host(hsotg->uphy->otg, &hcd->self);
/*
* Finish generic HCD initialization and start the HCD. This function
* allocates the DMA buffer pool, registers the USB bus, requests the
* IRQ line, and calls hcd_start method.
*/
retval = usb_add_hcd(hcd, hsotg->irq, IRQF_SHARED);
if (retval < 0)
goto error4;
/*
* Removes the HCD.
* Frees memory and resources associated with the HCD and deregisters the bus.
*/
void dwc2_hcd_remove(struct dwc2_hsotg *hsotg)
{
struct usb_hcd *hcd;
/**
* dwc2_backup_host_registers() - Backup controller host registers.
* When suspending usb bus, registers needs to be backuped
* if controller power is disabled once suspended.
*
* @hsotg: Programming view of the DWC_otg controller
*/
int java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 4
{
struct dwc2_hregs_backup *hr;
int i;
dev_dbg(hsotg->dev, "%s\n", __func__);
/* Backup Host regs *s java.lang.StringIndexOutOfBoundsException: Range [35, 28) out of bounds for length 74
hr = struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd);
hr->hcfg = dwc2_readl(hsotg, HCFG);
hr->hflbaddr = dwc2_readl(hsotg, HFLBADDR);
hr->haintmsk = dwc2_readl(hsotg, HAINTMSK);
for (java.lang.StringIndexOutOfBoundsException: Range [0, 7) out of bounds for length 0
hr->hcchar[i] = dwc2_readl(hsotg, HCCHAR(i));
hr->hcsplt[i] = dwc2_readl(hsotg, HCSPLT(i));
hr->hcintmsk[i] = dwc2_readl(hsotg, HCINTMSK(i));
hr->hctsiz[i] = dwc2_readl(hsotg, HCTSIZ(i));
hr->hcidma[i] = dwc2_readl(hsotg, HCDMA(i));
hr->hcidmab[i] = dwc2_readl(hsotg, HCDMAB(i));
}
/**
* dwc2_restore_host_registers() - Restore controller host registers.
* When resuming usb bus, device registers needs to be restored
* if controller power were disabled.
*
* @hsotg: Programming view of the DWC_otg controller
*/
int dwc2_restore_host_registers(struct dwc2_hsotg *hsotg)
{
struct dwc2_hregs_backup *hr;
int i;
dev_dbg(hsotg->dev, "%s\n", __func__);
/* Restore host regs */
hr = &hsotg->hr_backup;
if (!hr->valid) {
dev_err(hsotg->dev, "%s: no host registers to restore\n",
__func__);
return -EINVAL;
}
hr->valid = false;
int dwc2_host_backup_critical_registers(struct dwc2_hsotg *hsotg)
{
int ret;
/* Backup all registers */
ret = dwc2_backup_global_registers(hsotg);
if (ret) {
dev_err(hsotg->dev, "%s: failed to backup global registers\n",
__func__);
return ret;
}
ret = dwc2_backup_host_registers(hsotg);
if (ret) {
dev_err(hsotg->dev, "%s: failed to backup host registers\n",
__func__);
return ret;
}
return 0;
}
int dwc2_host_restore_critical_registers(struct dwc2_hsotg *hsotg)
{
int ret;
ret = dwc2_restore_global_registers(hsotg);
if (ret) {
dev_err(hsotg->dev, "%s: failed to restore registers\n",
__func__);
return ret;
}
ret = dwc2_restore_host_registers(hsotg);
if (ret) {
dev_err(hsotg->dev, "%s: failed to restore host registers\n",
__func__);
return ret;
}
return 0;
}
/**
* dwc2_host_enter_hibernation() - Put controller in Hibernation.
*
* @hsotg: Programming view of the DWC_otg controller
*/
int dwc2_host_enter_hibernation(struct dwc2_hsotg *hsotg)
{
unsigned long flags;
int ret = 0;
u32 hprt0;
u32 pcgcctl;
u32 gusbcfg;
u32 gpwrdn;
dev_dbg(hsotg->dev, "Preparing host for hibernation\n");
ret = dwc2_host_backup_critical_registers(hsotg);
if (ret)
return ret;
/* Enter USB Suspend Mode */
hprt0 = dwc2_readl(hsotg, HPRT0);
hprt0 |= HPRT0_SUSP;
hprt0 &= ~HPRT0_ENA;
dwc2_writel(hsotg, hprt0, HPRT0);
/* Wait for the HPRT0.PrtSusp register field to be set */
if (dwc2_hsotg_wait_bit_set(hsotg, HPRT0, HPRT0_SUSP, 5000))
dev_warn(hsotg->dev, "Suspend wasn't generated\n");
/*
* We need to disable interrupts to prevent servicing of any IRQ
* during going to hibernation
*/
spin_lock_irqsave(&hsotg->lock, flags);
hsotg->lx_state = DWC2_L2;
/*
* dwc2_host_exit_hibernation()
*
* @hsotg: Programming view of the DWC_otg controller
* @rem_wakeup: indicates whether resume is initiated by Device or Host.
* @param reset: indicates whether resume is initiated by Reset.
*
* Return: non-zero if failed to enter to hibernation.
*
* This function is for exiting from Host mode hibernation by
* Host Initiated Resume/Reset and Device Initiated Remote-Wakeup.
*/
int dwc2_host_exit_hibernation(struct dwc2_hsotg *hsotg, int rem_wakeup,
int reset)
{
u32 gpwrdn;
u32 hprt0;
int ret = 0;
struct dwc2_gregs_backup *gr;
struct dwc2_hregs_backup *hr;
gr = &hsotg->gr_backup;
hr = &hsotg->hr_backup;
dev_dbg(hsotg->dev,
"%s: called with rem_wakeup = %d reset = %d\n",
__func__, rem_wakeup, reset);
/*
* This step is not described in functional spec but if not wait for
* this delay, mismatch interrupts occurred because just after restore
* core is in Device mode(gintsts.curmode == 0)
*/
mdelay(100);
/* Clear all pending interupts */
dwc2_writel(hsotg, 0xffffffff, GINTSTS);
if (reset) {
hprt0 |= HPRT0_RST;
dwc2_writel(hsotg, hprt0, HPRT0);
/* Wait for Resume time and then program HPRT again */
mdelay(60);
hprt0 &= ~HPRT0_RST;
dwc2_writel(hsotg, hprt0, HPRT0);
} else {
hprt0 |= HPRT0_RES;
dwc2_writel(hsotg, hprt0, HPRT0);
/* De-assert Wakeup Logic */
if ((rem_wakeup && hsotg->hw_params.snpsid >= DWC2_CORE_REV_4_30a)) {
gpwrdn = dwc2_readl(hsotg, GPWRDN);
gpwrdn &= ~GPWRDN_PMUACTV;
dwc2_writel(hsotg, gpwrdn, GPWRDN);
udelay(10);
}
/* Wait for Resume time and then program HPRT again */
mdelay(100);
hprt0 &= ~HPRT0_RES;
dwc2_writel(hsotg, hprt0, HPRT0);
}
/* Clear all interrupt status */
hprt0 = dwc2_readl(hsotg, HPRT0);
hprt0 |= HPRT0_CONNDET;
hprt0 |= HPRT0_ENACHG;
hprt0 &= ~HPRT0_ENA;
dwc2_writel(hsotg, hprt0, HPRT0);
hprt0 = dwc2_readl(hsotg, HPRT0);
/* Clear all pending interupts */
dwc2_writel(hsotg, 0xffffffff, GINTSTS);
/* Restore global registers */
ret = dwc2_host_restore_critical_registers(hsotg);
if (ret)
return ret;
if (rem_wakeup) {
dwc2_hcd_rem_wakeup(hsotg);
/*
* Change "port_connect_status_change" flag to re-enumerate,
* because after exit from hibernation port connection status
* is not detected.
*/
hsotg->flags.b.port_connect_status_change = 1;
}
/* If the controller isn't allowed to wakeup then we can power off. */
if (!device_may_wakeup(dwc2->dev))
return true;
/*
* We don't want to power off the PHY if something under the
* root hub has wakeup enabled.
*/
if (usb_wakeup_enabled_descendants(root_hub))
return false;
/* No reason to keep the PHY powered, so allow poweroff */
return true;
}
/**
* dwc2_host_enter_partial_power_down() - Put controller in partial
* power down.
*
* @hsotg: Programming view of the DWC_otg controller
*
* Return: non-zero if failed to enter host partial power down.
*
* This function is for entering Host mode partial power down.
*/
int dwc2_host_enter_partial_power_down(struct dwc2_hsotg *hsotg)
{
u32 pcgcctl;
u32 hprt0;
int ret = 0;
dev_dbg(hsotg->dev, "Entering host partial power down started.\n");
/* Put this port in suspend mode. */
hprt0 = dwc2_read_hprt0(hsotg);
hprt0 |= HPRT0_SUSP;
dwc2_writel(hsotg, hprt0, HPRT0);
udelay(5);
/* Wait for the HPRT0.PrtSusp register field to be set */
if (dwc2_hsotg_wait_bit_set(hsotg, HPRT0, HPRT0_SUSP, 3000))
dev_warn(hsotg->dev, "Suspend wasn't generated\n");
/* Backup all registers */
ret = dwc2_host_backup_critical_registers(hsotg);
if (ret)
return ret;
/*
* Clear any pending interrupts since dwc2 will not be able to
* clear them after entering partial_power_down.
*/
dwc2_writel(hsotg, 0xffffffff, GINTSTS);
/* Put the controller in low power state */
pcgcctl = dwc2_readl(hsotg, PCGCTL);
/* Set in_ppd flag to 1 as here core enters suspend. */
hsotg->in_ppd = 1;
hsotg->lx_state = DWC2_L2;
hsotg->bus_suspended = true;
dev_dbg(hsotg->dev, "Entering host partial power down completed.\n");
return ret;
}
/*
* dwc2_host_exit_partial_power_down() - Exit controller from host partial
* power down.
*
* @hsotg: Programming view of the DWC_otg controller
* @rem_wakeup: indicates whether resume is initiated by Reset.
* @restore: indicates whether need to restore the registers or not.
*
* Return: non-zero if failed to exit host partial power down.
*
* This function is for exiting from Host mode partial power down.
*/
int dwc2_host_exit_partial_power_down(struct dwc2_hsotg *hsotg,
int rem_wakeup, bool restore)
{
u32 pcgcctl;
int ret = 0;
u32 hprt0;
dev_dbg(hsotg->dev, "Exiting host partial power down started.\n");
/* Set lx_state to and in_ppd to 0 as here core exits from suspend. */
hsotg->in_ppd = 0;
hsotg->lx_state = DWC2_L0;
dev_dbg(hsotg->dev, "Exiting host partial power down completed.\n");
return ret;
}
/**
* dwc2_host_enter_clock_gating() - Put controller in clock gating.
*
* @hsotg: Programming view of the DWC_otg controller
*
* This function is for entering Host mode clock gating.
*/
void dwc2_host_enter_clock_gating(struct dwc2_hsotg *hsotg)
{
u32 hprt0;
u32 pcgctl;
/* Put this port in suspend mode. */
hprt0 = dwc2_read_hprt0(hsotg);
hprt0 |= HPRT0_SUSP;
dwc2_writel(hsotg, hprt0, HPRT0);
/* Set the Phy Clock bit as suspend is received. */
pcgctl = dwc2_readl(hsotg, PCGCTL);
pcgctl |= PCGCTL_STOPPCLK;
dwc2_writel(hsotg, pcgctl, PCGCTL);
udelay(5);
/* Set the Gate hclk as suspend is received. */
pcgctl = dwc2_readl(hsotg, PCGCTL);
pcgctl |= PCGCTL_GATEHCLK;
dwc2_writel(hsotg, pcgctl, PCGCTL);
udelay(5);
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.1.193Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.