On Sun, Nov 22, 2015 at 12:32:41PM +0200, Andy Shevchenko wrote: > On Sun, Nov 22, 2015 at 11:19 AM, Dave Penkler <dpenkler@xxxxxxxxx> wrote: > > On Wed, Nov 18, 2015 at 11:55:27AM +0200, Andy Shevchenko wrote: > >> On Wed, Nov 18, 2015 at 10:37 AM, Dave Penkler <dpenkler@xxxxxxxxx> wrote: > > >> > + switch (status) { > >> > + case 0: /* SUCCESS */ > >> > + if (data->iin_buffer[0] & 0x80) { > >> > + /* check for valid STB notification */ > >> > + if ((data->iin_buffer[0] & 0x7f) > 1) { > >> > >> Despite your answer to my comment code is quite understandable even with & 0x7e. > >> You already put comment line about this, you may add that you validate > >> the value to be 127 >= value >= 2. > >> > > > > Yes it is quite understandable but it is less clear. I repeat my comment here: > > When reading the spec and the code it is more obvious that here > > we are testing for the value in bits D6..D0 to be a valid iin_bTag return. > > (See Table 7 in the USBTMC-USB488 spec.) > > > > What is your motivation for > > > > if (data->iin_buffer[0] & 0x7e) > > > > ? > > In non-optimized variant it will certainly generate less code. You may > have check assembly code with -O2 and compare. I don't know if > compiler is clever enough to do the same by itself. > I tested out both variants, and the explicit test is actually faster on by box: $ cat tp.c #include <stdlib.h> #include <stdio.h> #define xstr(s) str(s) #define str(s) #s main() { unsigned int v,s=0; struct recs { unsigned char *iin_buffer; } rec; struct recs *data = &rec; data->iin_buffer = (unsigned char *) malloc(8); for (v=1;v;v++) { data->iin_buffer[0] = v & 0x7f; if (TEST) s++; } printf("%s %x\n",xstr(TEST),s); } $ cc -O2 tp.c -DTEST='data->iin_buffer[0] & 0x7e' $ time ./a.out data->iin_buffer[0] & 0x7e fc000000 real 0m3.927s user 0m3.920s sys 0m0.000s $ time ./a.out data->iin_buffer[0] & 0x7e fc000000 real 0m3.925s user 0m3.920s sys 0m0.000s $ cc -O2 tp.c -DTEST='(data->iin_buffer[0] & 0x7f) > 1' $ time ./a.out (data->iin_buffer[0] & 0x7f) > 1 fc000000 real 0m2.638s user 0m2.610s sys 0m0.000s $ time ./a.out (data->iin_buffer[0] & 0x7f) > 1 fc000000 real 0m2.648s user 0m2.620s sys 0m0.000s > >> > + /* urb terminated, clean up */ > >> > + dev_dbg(&data->intf->dev, > >> > + "%s - urb terminated, status: %d\n", > >> > + __func__, status); > >> > >> No need to print function here explicitly. Check Dynamic Debug framework. > > > > I am not using dynamic debug but when I enable static debug I get: > > > > [ 1438.562458] usbtmc 1-1:1.0: Enter ioctl_read_stb iin_ep_present: 1 > > > > on the console log for > > > > dev_dbg(dev, "Enter ioctl_read_stb iin_ep_present: %d\n", > > data->iin_ep_present); > > > > So if I don't print the function it does not appear on the log. > > Whatever maintainers prefer, though I think there are quite rare cases > in USB when someone needs static debug. I'm pretty sure most of the > developers all in favour of dynamic debug. > I am happy to remove the func > >> > retcode = sysfs_create_group(&intf->dev.kobj, &data_attr_grp); > >> > > >> > retcode = usb_register_dev(intf, &usbtmc_class); > >> > >> Hmm??? Unrelated to this patch, but notice that retcode is overridden here. > > > > -- > With Best Regards, > Andy Shevchenko -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html