CC: [email protected]
CC: [email protected]
TO: Mathias Nyman <[email protected]>
CC: "Greg Kroah-Hartman" <[email protected]>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 
master
head:   509a15421674b9e1a3e1916939d0d0efd3e578da
commit: fc57313d1017dd6b6f37a94e88daa8df54368ecc xhci: Fix memory leak when 
caching protocol extended capability PSI tables
date:   10 months ago
:::::: branch date: 16 hours ago
:::::: commit date: 10 months ago
compiler: or1k-linux-gcc (GCC) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>


cppcheck possible warnings: (new ones prefixed by >>, may not real problems)

   drivers/usb/host/xhci-hub.c:656:9: warning: Identical condition 'retval', 
second condition is always false [identicalConditionAfterEarlyExit]
    return retval;
           ^
   drivers/usb/host/xhci-hub.c:647:6: note: first condition
    if (retval)
        ^
   drivers/usb/host/xhci-hub.c:656:9: note: second condition
    return retval;
           ^
   drivers/usb/host/xhci.h:2440:11: warning: %d in format string (no. 1) 
requires 'int' but the argument type is 'unsigned int'. 
[invalidPrintfArgType_sint]
      ret += sprintf(str + ret, " %d%s",
             ^
   drivers/usb/host/xhci.h:2452:11: warning: %d in format string (no. 1) 
requires 'int' but the argument type is 'unsigned int'. 
[invalidPrintfArgType_sint]
      ret += sprintf(str + ret, " %d%s",
             ^
>> drivers/usb/host/xhci-hub.c:79:7: warning: Possible null pointer 
>> dereference: port_cap [nullPointer]
     if (port_cap->psi_count) {
         ^
   drivers/usb/host/xhci-hub.c:58:35: note: Assignment 'port_cap=NULL', 
assigned value is 0
    struct xhci_port_cap *port_cap = NULL;
                                     ^
   drivers/usb/host/xhci-hub.c:79:7: note: Null pointer dereference
     if (port_cap->psi_count) {
         ^
>> drivers/usb/host/xhci-hub.c:1390:8: warning: Variable 'temp' is reassigned a 
>> value before the old one has been used. 'break;' missing? 
>> [redundantAssignInSwitch]
     temp = readl(ports[wIndex]->addr);
          ^
   drivers/usb/host/xhci-hub.c:1235:9: note: Variable 'temp' is reassigned a 
value before the old one has been used. 'break;' missing?
      temp = readl(ports[wIndex]->addr);
           ^
   drivers/usb/host/xhci-hub.c:1390:8: note: Variable 'temp' is reassigned a 
value before the old one has been used. 'break;' missing?
     temp = readl(ports[wIndex]->addr);
          ^
>> drivers/usb/host/xhci-hub.c:1390:8: warning: Variable 'temp' is reassigned a 
>> value before the old one has been used. 'break;' missing? 
>> [redundantAssignInSwitch]
     temp = readl(ports[wIndex]->addr);
          ^
   drivers/usb/host/xhci-hub.c:1252:10: note: Variable 'temp' is reassigned a 
value before the old one has been used. 'break;' missing?
       temp = readl(ports[wIndex]->addr);
            ^
   drivers/usb/host/xhci-hub.c:1390:8: note: Variable 'temp' is reassigned a 
value before the old one has been used. 'break;' missing?
     temp = readl(ports[wIndex]->addr);
          ^
>> drivers/usb/host/xhci-hub.c:1390:8: warning: Variable 'temp' is reassigned a 
>> value before the old one has been used. 'break;' missing? 
>> [redundantAssignInSwitch]
     temp = readl(ports[wIndex]->addr);
          ^
   drivers/usb/host/xhci-hub.c:1261:10: note: Variable 'temp' is reassigned a 
value before the old one has been used. 'break;' missing?
       temp = readl(ports[wIndex]->addr);
            ^
   drivers/usb/host/xhci-hub.c:1390:8: note: Variable 'temp' is reassigned a 
value before the old one has been used. 'break;' missing?
     temp = readl(ports[wIndex]->addr);
          ^
>> drivers/usb/host/xhci-hub.c:1390:8: warning: Variable 'temp' is reassigned a 
>> value before the old one has been used. 'break;' missing? 
>> [redundantAssignInSwitch]
     temp = readl(ports[wIndex]->addr);
          ^
   drivers/usb/host/xhci-hub.c:1295:10: note: Variable 'temp' is reassigned a 
value before the old one has been used. 'break;' missing?
       temp = readl(ports[wIndex]->addr);
            ^
   drivers/usb/host/xhci-hub.c:1390:8: note: Variable 'temp' is reassigned a 
value before the old one has been used. 'break;' missing?
     temp = readl(ports[wIndex]->addr);
          ^
>> drivers/usb/host/xhci-hub.c:1390:8: warning: Variable 'temp' is reassigned a 
>> value before the old one has been used. 'break;' missing? 
>> [redundantAssignInSwitch]
     temp = readl(ports[wIndex]->addr);
          ^
   drivers/usb/host/xhci-hub.c:1328:9: note: Variable 'temp' is reassigned a 
value before the old one has been used. 'break;' missing?
      temp = readl(ports[wIndex]->addr);
           ^
   drivers/usb/host/xhci-hub.c:1390:8: note: Variable 'temp' is reassigned a 
value before the old one has been used. 'break;' missing?
     temp = readl(ports[wIndex]->addr);
          ^
>> drivers/usb/host/xhci-hub.c:1390:8: warning: Variable 'temp' is reassigned a 
>> value before the old one has been used. 'break;' missing? 
>> [redundantAssignInSwitch]
     temp = readl(ports[wIndex]->addr);
          ^
   drivers/usb/host/xhci-hub.c:1359:9: note: Variable 'temp' is reassigned a 
value before the old one has been used. 'break;' missing?
      temp = readl(ports[wIndex]->addr);
           ^
   drivers/usb/host/xhci-hub.c:1390:8: note: Variable 'temp' is reassigned a 
value before the old one has been used. 'break;' missing?
     temp = readl(ports[wIndex]->addr);
          ^
>> drivers/usb/host/xhci-hub.c:1357:12: warning: Shifting signed 32-bit value 
>> by 31 bits is undefined behaviour [shiftTooManyBitsSigned]
      temp |= PORT_WR;
              ^

vim +79 drivers/usb/host/xhci-hub.c

48e8236114c12c5 Sarah Sharp   2011-10-06   54  
5693e0b77f82cdd Mathias Nyman 2015-10-01   55  static int 
xhci_create_usb3_bos_desc(struct xhci_hcd *xhci, char *buf,
5693e0b77f82cdd Mathias Nyman 2015-10-01   56                                
u16 wLength)
5693e0b77f82cdd Mathias Nyman 2015-10-01   57  {
fc57313d1017dd6 Mathias Nyman 2020-02-10   58   struct xhci_port_cap *port_cap 
= NULL;
5693e0b77f82cdd Mathias Nyman 2015-10-01   59   int i, ssa_count;
5693e0b77f82cdd Mathias Nyman 2015-10-01   60   u32 temp;
5693e0b77f82cdd Mathias Nyman 2015-10-01   61   u16 desc_size, ssp_cap_size, 
ssa_size = 0;
5693e0b77f82cdd Mathias Nyman 2015-10-01   62   bool usb3_1 = false;
5693e0b77f82cdd Mathias Nyman 2015-10-01   63  
5693e0b77f82cdd Mathias Nyman 2015-10-01   64   desc_size = USB_DT_BOS_SIZE + 
USB_DT_USB_SS_CAP_SIZE;
5693e0b77f82cdd Mathias Nyman 2015-10-01   65   ssp_cap_size = 
sizeof(usb_bos_descriptor) - desc_size;
5693e0b77f82cdd Mathias Nyman 2015-10-01   66  
5693e0b77f82cdd Mathias Nyman 2015-10-01   67   /* does xhci support USB 3.1 
Enhanced SuperSpeed */
fc57313d1017dd6 Mathias Nyman 2020-02-10   68   for (i = 0; i < 
xhci->num_port_caps; i++) {
fc57313d1017dd6 Mathias Nyman 2020-02-10   69           if 
(xhci->port_caps[i].maj_rev == 0x03 &&
fc57313d1017dd6 Mathias Nyman 2020-02-10   70               
xhci->port_caps[i].min_rev >= 0x01) {
fc57313d1017dd6 Mathias Nyman 2020-02-10   71                   usb3_1 = true;
fc57313d1017dd6 Mathias Nyman 2020-02-10   72                   port_cap = 
&xhci->port_caps[i];
fc57313d1017dd6 Mathias Nyman 2020-02-10   73                   break;
fc57313d1017dd6 Mathias Nyman 2020-02-10   74           }
fc57313d1017dd6 Mathias Nyman 2020-02-10   75   }
fc57313d1017dd6 Mathias Nyman 2020-02-10   76  
fc57313d1017dd6 Mathias Nyman 2020-02-10   77   if (usb3_1) {
5da665fcec1a308 Mathias Nyman 2016-01-25   78           /* does xhci provide a 
PSI table for SSA speed attributes? */
fc57313d1017dd6 Mathias Nyman 2020-02-10  @79           if 
(port_cap->psi_count) {
5da665fcec1a308 Mathias Nyman 2016-01-25   80                   /* two SSA 
entries for each unique PSI ID, RX and TX */
fc57313d1017dd6 Mathias Nyman 2020-02-10   81                   ssa_count = 
port_cap->psi_uid_count * 2;
5693e0b77f82cdd Mathias Nyman 2015-10-01   82                   ssa_size = 
ssa_count * sizeof(u32);
5da665fcec1a308 Mathias Nyman 2016-01-25   83                   ssp_cap_size -= 
16; /* skip copying the default SSA */
5da665fcec1a308 Mathias Nyman 2016-01-25   84           }
5693e0b77f82cdd Mathias Nyman 2015-10-01   85           desc_size += 
ssp_cap_size;
5693e0b77f82cdd Mathias Nyman 2015-10-01   86   }
5693e0b77f82cdd Mathias Nyman 2015-10-01   87   memcpy(buf, 
&usb_bos_descriptor, min(desc_size, wLength));
5693e0b77f82cdd Mathias Nyman 2015-10-01   88  
5693e0b77f82cdd Mathias Nyman 2015-10-01   89   if (usb3_1) {
5693e0b77f82cdd Mathias Nyman 2015-10-01   90           /* modify bos 
descriptor bNumDeviceCaps and wTotalLength */
5693e0b77f82cdd Mathias Nyman 2015-10-01   91           buf[4] += 1;
5693e0b77f82cdd Mathias Nyman 2015-10-01   92           
put_unaligned_le16(desc_size + ssa_size, &buf[2]);
5693e0b77f82cdd Mathias Nyman 2015-10-01   93   }
5693e0b77f82cdd Mathias Nyman 2015-10-01   94  
5693e0b77f82cdd Mathias Nyman 2015-10-01   95   if (wLength < USB_DT_BOS_SIZE + 
USB_DT_USB_SS_CAP_SIZE)
5693e0b77f82cdd Mathias Nyman 2015-10-01   96           return wLength;
5693e0b77f82cdd Mathias Nyman 2015-10-01   97  
5693e0b77f82cdd Mathias Nyman 2015-10-01   98   /* Indicate whether the host 
has LTM support. */
5693e0b77f82cdd Mathias Nyman 2015-10-01   99   temp = 
readl(&xhci->cap_regs->hcc_params);
5693e0b77f82cdd Mathias Nyman 2015-10-01  100   if (HCC_LTC(temp))
5693e0b77f82cdd Mathias Nyman 2015-10-01  101           buf[8] |= 
USB_LTM_SUPPORT;
5693e0b77f82cdd Mathias Nyman 2015-10-01  102  
5693e0b77f82cdd Mathias Nyman 2015-10-01  103   /* Set the U1 and U2 exit 
latencies. */
5693e0b77f82cdd Mathias Nyman 2015-10-01  104   if ((xhci->quirks & 
XHCI_LPM_SUPPORT)) {
5693e0b77f82cdd Mathias Nyman 2015-10-01  105           temp = 
readl(&xhci->cap_regs->hcs_params3);
5693e0b77f82cdd Mathias Nyman 2015-10-01  106           buf[12] = 
HCS_U1_LATENCY(temp);
5693e0b77f82cdd Mathias Nyman 2015-10-01  107           
put_unaligned_le16(HCS_U2_LATENCY(temp), &buf[13]);
5693e0b77f82cdd Mathias Nyman 2015-10-01  108   }
5693e0b77f82cdd Mathias Nyman 2015-10-01  109  
5da665fcec1a308 Mathias Nyman 2016-01-25  110   /* If PSI table exists, add the 
custom speed attributes from it */
fc57313d1017dd6 Mathias Nyman 2020-02-10  111   if (usb3_1 && 
port_cap->psi_count) {
7bea22b124d7784 Mathias Nyman 2017-09-18  112           u32 ssp_cap_base, 
bm_attrib, psi, psi_mant, psi_exp;
5693e0b77f82cdd Mathias Nyman 2015-10-01  113           int offset;
5693e0b77f82cdd Mathias Nyman 2015-10-01  114  
5693e0b77f82cdd Mathias Nyman 2015-10-01  115           ssp_cap_base = 
USB_DT_BOS_SIZE + USB_DT_USB_SS_CAP_SIZE;
5693e0b77f82cdd Mathias Nyman 2015-10-01  116  
5693e0b77f82cdd Mathias Nyman 2015-10-01  117           if (wLength < desc_size)
5693e0b77f82cdd Mathias Nyman 2015-10-01  118                   return wLength;
5693e0b77f82cdd Mathias Nyman 2015-10-01  119           buf[ssp_cap_base] = 
ssp_cap_size + ssa_size;
5693e0b77f82cdd Mathias Nyman 2015-10-01  120  
5693e0b77f82cdd Mathias Nyman 2015-10-01  121           /* attribute count SSAC 
bits 4:0 and ID count SSIC bits 8:5 */
5693e0b77f82cdd Mathias Nyman 2015-10-01  122           bm_attrib = (ssa_count 
- 1) & 0x1f;
fc57313d1017dd6 Mathias Nyman 2020-02-10  123           bm_attrib |= 
(port_cap->psi_uid_count - 1) << 5;
5693e0b77f82cdd Mathias Nyman 2015-10-01  124           
put_unaligned_le32(bm_attrib, &buf[ssp_cap_base + 4]);
5693e0b77f82cdd Mathias Nyman 2015-10-01  125  
5693e0b77f82cdd Mathias Nyman 2015-10-01  126           if (wLength < desc_size 
+ ssa_size)
5693e0b77f82cdd Mathias Nyman 2015-10-01  127                   return wLength;
5693e0b77f82cdd Mathias Nyman 2015-10-01  128           /*
5693e0b77f82cdd Mathias Nyman 2015-10-01  129            * Create the Sublink 
Speed Attributes (SSA) array.
5693e0b77f82cdd Mathias Nyman 2015-10-01  130            * The xhci PSI field 
and USB 3.1 SSA fields are very similar,
5693e0b77f82cdd Mathias Nyman 2015-10-01  131            * but link type bits 
7:6 differ for values 01b and 10b.
5693e0b77f82cdd Mathias Nyman 2015-10-01  132            * xhci has also only 
one PSI entry for a symmetric link when
5693e0b77f82cdd Mathias Nyman 2015-10-01  133            * USB 3.1 requires two 
SSA entries (RX and TX) for every link
5693e0b77f82cdd Mathias Nyman 2015-10-01  134            */
5693e0b77f82cdd Mathias Nyman 2015-10-01  135           offset = desc_size;
fc57313d1017dd6 Mathias Nyman 2020-02-10  136           for (i = 0; i < 
port_cap->psi_count; i++) {
fc57313d1017dd6 Mathias Nyman 2020-02-10  137                   psi = 
port_cap->psi[i];
5693e0b77f82cdd Mathias Nyman 2015-10-01  138                   psi &= 
~USB_SSP_SUBLINK_SPEED_RSVD;
7bea22b124d7784 Mathias Nyman 2017-09-18  139                   psi_exp = 
XHCI_EXT_PORT_PSIE(psi);
7bea22b124d7784 Mathias Nyman 2017-09-18  140                   psi_mant = 
XHCI_EXT_PORT_PSIM(psi);
7bea22b124d7784 Mathias Nyman 2017-09-18  141  
7bea22b124d7784 Mathias Nyman 2017-09-18  142                   /* Shift to 
Gbps and set SSP Link BIT(14) if 10Gpbs */
7bea22b124d7784 Mathias Nyman 2017-09-18  143                   for (; psi_exp 
< 3; psi_exp++)
7bea22b124d7784 Mathias Nyman 2017-09-18  144                           
psi_mant /= 1000;
7bea22b124d7784 Mathias Nyman 2017-09-18  145                   if (psi_mant >= 
10)
7bea22b124d7784 Mathias Nyman 2017-09-18  146                           psi |= 
BIT(14);
7bea22b124d7784 Mathias Nyman 2017-09-18  147  
5693e0b77f82cdd Mathias Nyman 2015-10-01  148                   if ((psi & 
PLT_MASK) == PLT_SYM) {
5693e0b77f82cdd Mathias Nyman 2015-10-01  149                   /* Symmetric, 
create SSA RX and TX from one PSI entry */
5693e0b77f82cdd Mathias Nyman 2015-10-01  150                           
put_unaligned_le32(psi, &buf[offset]);
5693e0b77f82cdd Mathias Nyman 2015-10-01  151                           psi |= 
1 << 7;  /* turn entry to TX */
5693e0b77f82cdd Mathias Nyman 2015-10-01  152                           offset 
+= 4;
5693e0b77f82cdd Mathias Nyman 2015-10-01  153                           if 
(offset >= desc_size + ssa_size)
5693e0b77f82cdd Mathias Nyman 2015-10-01  154                                   
return desc_size + ssa_size;
5693e0b77f82cdd Mathias Nyman 2015-10-01  155                   } else if ((psi 
& PLT_MASK) == PLT_ASYM_RX) {
5693e0b77f82cdd Mathias Nyman 2015-10-01  156                           /* 
Asymetric RX, flip bits 7:6 for SSA */
5693e0b77f82cdd Mathias Nyman 2015-10-01  157                           psi ^= 
PLT_MASK;
5693e0b77f82cdd Mathias Nyman 2015-10-01  158                   }
5693e0b77f82cdd Mathias Nyman 2015-10-01  159                   
put_unaligned_le32(psi, &buf[offset]);
5693e0b77f82cdd Mathias Nyman 2015-10-01  160                   offset += 4;
5693e0b77f82cdd Mathias Nyman 2015-10-01  161                   if (offset >= 
desc_size + ssa_size)
5693e0b77f82cdd Mathias Nyman 2015-10-01  162                           return 
desc_size + ssa_size;
5693e0b77f82cdd Mathias Nyman 2015-10-01  163           }
5693e0b77f82cdd Mathias Nyman 2015-10-01  164   }
5693e0b77f82cdd Mathias Nyman 2015-10-01  165   /* ssa_size is 0 for other than 
usb 3.1 hosts */
5693e0b77f82cdd Mathias Nyman 2015-10-01  166   return desc_size + ssa_size;
5693e0b77f82cdd Mathias Nyman 2015-10-01  167  }
48e8236114c12c5 Sarah Sharp   2011-10-06  168  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]
_______________________________________________
kbuild mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to