* [bug report] usb: cdns3: gadget: improve the dump TRB operation at cdns3_ep_run_transfer
@ 2020-11-02 7:11 Dan Carpenter
0 siblings, 0 replies; only message in thread
From: Dan Carpenter @ 2020-11-02 7:11 UTC (permalink / raw)
To: peter.chen; +Cc: linux-usb
Hello Peter Chen,
The patch 4e218882eb5a: "usb: cdns3: gadget: improve the dump TRB
operation at cdns3_ep_run_transfer" from Sep 10, 2020, leads to the
following static checker warning:
drivers/usb/cdns3/gadget.c:1305 cdns3_ep_run_transfer()
error: uninitialized symbol 'link_trb'.
drivers/usb/cdns3/gadget.c
1111 static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep,
1112 struct usb_request *request)
1113 {
1114 struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
1115 struct cdns3_request *priv_req;
1116 struct cdns3_trb *trb;
1117 struct cdns3_trb *link_trb;
1118 dma_addr_t trb_dma;
1119 u32 togle_pcs = 1;
1120 int sg_iter = 0;
1121 int num_trb;
1122 int address;
1123 u32 control;
1124 int pcs;
1125 u16 total_tdl = 0;
1126 struct scatterlist *s = NULL;
1127 bool sg_supported = !!(request->num_mapped_sgs);
1128
1129 if (priv_ep->type == USB_ENDPOINT_XFER_ISOC)
1130 num_trb = priv_ep->interval;
1131 else
1132 num_trb = sg_supported ? request->num_mapped_sgs : 1;
num_trb set here.
1133
1134 if (num_trb > priv_ep->free_trbs) {
1135 priv_ep->flags |= EP_RING_FULL;
1136 return -ENOBUFS;
1137 }
1138
1139 priv_req = to_cdns3_request(request);
1140 address = priv_ep->endpoint.desc->bEndpointAddress;
1141
1142 priv_ep->flags |= EP_PENDING_REQUEST;
1143
1144 /* must allocate buffer aligned to 8 */
1145 if (priv_req->flags & REQUEST_UNALIGNED)
1146 trb_dma = priv_req->aligned_buf->dma;
1147 else
1148 trb_dma = request->dma;
1149
1150 trb = priv_ep->trb_pool + priv_ep->enqueue;
1151 priv_req->start_trb = priv_ep->enqueue;
1152 priv_req->trb = trb;
1153
1154 cdns3_select_ep(priv_ep->cdns3_dev, address);
1155
1156 /* prepare ring */
1157 if ((priv_ep->enqueue + num_trb) >= (priv_ep->num_trbs - 1)) {
1158 int doorbell, dma_index;
1159 u32 ch_bit = 0;
1160
1161 doorbell = !!(readl(&priv_dev->regs->ep_cmd) & EP_CMD_DRDY);
1162 dma_index = cdns3_get_dma_pos(priv_dev, priv_ep);
1163
1164 /* Driver can't update LINK TRB if it is current processed. */
1165 if (doorbell && dma_index == priv_ep->num_trbs - 1) {
1166 priv_ep->flags |= EP_DEFERRED_DRDY;
1167 return -ENOBUFS;
1168 }
1169
1170 /*updating C bt in Link TRB before starting DMA*/
1171 link_trb = priv_ep->trb_pool + (priv_ep->num_trbs - 1);
1172 /*
1173 * For TRs size equal 2 enabling TRB_CHAIN for epXin causes
1174 * that DMA stuck at the LINK TRB.
1175 * On the other hand, removing TRB_CHAIN for longer TRs for
1176 * epXout cause that DMA stuck after handling LINK TRB.
1177 * To eliminate this strange behavioral driver set TRB_CHAIN
1178 * bit only for TR size > 2.
1179 */
1180 if (priv_ep->type == USB_ENDPOINT_XFER_ISOC ||
1181 TRBS_PER_SEGMENT > 2)
1182 ch_bit = TRB_CHAIN;
1183
1184 link_trb->control = cpu_to_le32(((priv_ep->pcs) ? TRB_CYCLE : 0) |
1185 TRB_TYPE(TRB_LINK) | TRB_TOGGLE | ch_bit);
1186 }
link_trb not set on else path.
1187
1188 if (priv_dev->dev_ver <= DEV_VER_V2)
1189 togle_pcs = cdns3_wa1_update_guard(priv_ep, trb);
1190
[ snip ]
1296
1297 if (priv_dev->dev_ver <= DEV_VER_V2)
1298 cdns3_wa1_tray_restore_cycle_bit(priv_dev, priv_ep);
1299
1300 if (num_trb > 1) {
1301 int i = 0;
1302
1303 while (i < num_trb) {
1304 trace_cdns3_prepare_trb(priv_ep, trb + i);
1305 if (trb + i == link_trb) {
^^^^^^^^
Potentially uninitialized.
1306 trb = priv_ep->trb_pool;
1307 num_trb = num_trb - i;
1308 i = 0;
1309 } else {
1310 i++;
1311 }
1312 }
1313 } else {
regards,
dan carpenter
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2020-11-02 7:12 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-02 7:11 [bug report] usb: cdns3: gadget: improve the dump TRB operation at cdns3_ep_run_transfer Dan Carpenter
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).