Hi Sujeev, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on linus/master] [also build test WARNING on v4.17-rc2 next-20180426] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Sujeev-Dias/mhi_bus-core-Add-support-for-MHI-host-interface/20180428-065959 config: i386-allmodconfig (attached as .config) compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=i386 All warnings (new ones prefixed by >>): In file included from drivers/bus/mhi/devices/mhi_uci.c:26:0: include/linux/mhi.h:658:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'int' static inlint int mhi_force_rddm_mode(struct mhi_controller *mhi_cntrl) ^~~ In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: drivers/bus/mhi/devices/mhi_uci.c: In function 'mhi_queue_inbound': >> include/linux/kern_levels.h:5:18: warning: format '%ld' expects argument of type 'long int', but argument 5 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:114:3: note: in expansion of macro 'MSG_VERB' MSG_VERB("Allocated buf %d of %d size %ld\n", i, nr_trbs, mtu); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:114:43: note: format string is defined here MSG_VERB("Allocated buf %d of %d size %ld\n", i, nr_trbs, mtu); ~~^ %d In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: drivers/bus/mhi/devices/mhi_uci.c: In function 'mhi_uci_write': include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ drivers/bus/mhi/devices/mhi_uci.c:243:2: note: in expansion of macro 'MSG_VERB' MSG_VERB("Enter: to xfer:%lu bytes\n", count); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:243:29: note: format string is defined here MSG_VERB("Enter: to xfer:%lu bytes\n", count); ~~^ %u In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:89:4: note: in expansion of macro 'pr_err' pr_err("[E][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:266:4: note: in expansion of macro 'MSG_ERR' MSG_ERR("Failed to allocate memory %lu\n", xfer_size); ^~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:266:41: note: format string is defined here MSG_ERR("Failed to allocate memory %lu\n", xfer_size); ~~^ %u In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ drivers/bus/mhi/devices/mhi_uci.c:295:2: note: in expansion of macro 'MSG_VERB' MSG_VERB("Exit: Number of bytes xferred:%lu\n", bytes_xfered); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:295:44: note: format string is defined here MSG_VERB("Exit: Number of bytes xferred:%lu\n", bytes_xfered); ~~^ %u In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: drivers/bus/mhi/devices/mhi_uci.c: In function 'mhi_uci_read': include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ drivers/bus/mhi/devices/mhi_uci.c:321:2: note: in expansion of macro 'MSG_VERB' MSG_VERB("Client provided buf len:%lu\n", count); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:321:38: note: format string is defined here MSG_VERB("Client provided buf len:%lu\n", count); ~~^ %u In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ drivers/bus/mhi/devices/mhi_uci.c:376:2: note: in expansion of macro 'MSG_VERB' MSG_VERB("Copied %lu of %lu bytes\n", to_copy, uci_chan->rx_size); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:376:21: note: format string is defined here MSG_VERB("Copied %lu of %lu bytes\n", to_copy, uci_chan->rx_size); ~~^ %u In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 4 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ drivers/bus/mhi/devices/mhi_uci.c:376:2: note: in expansion of macro 'MSG_VERB' MSG_VERB("Copied %lu of %lu bytes\n", to_copy, uci_chan->rx_size); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:376:28: note: format string is defined here MSG_VERB("Copied %lu of %lu bytes\n", to_copy, uci_chan->rx_size); ~~^ %u In file included from include/linux/printk.h:7:0, from include/linux/kernel.h:14, from include/linux/list.h:9, from include/linux/kobject.h:19, from include/linux/cdev.h:5, from drivers/bus/mhi/devices/mhi_uci.c:13: include/linux/kern_levels.h:5:18: warning: format '%lu' expects argument of type 'long unsigned int', but argument 3 has type 'size_t {aka unsigned int}' [-Wformat=] #define KERN_SOH "\001" /* ASCII Start Of Header */ ^ include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH' #define KERN_ERR KERN_SOH "3" /* error conditions */ ^~~~~~~~ include/linux/printk.h:304:9: note: in expansion of macro 'KERN_ERR' printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) ^~~~~~~~ >> drivers/bus/mhi/devices/mhi_uci.c:73:4: note: in expansion of macro 'pr_err' pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ ^~~~~~ drivers/bus/mhi/devices/mhi_uci.c:400:2: note: in expansion of macro 'MSG_VERB' MSG_VERB("Returning %lu bytes\n", to_copy); ^~~~~~~~ drivers/bus/mhi/devices/mhi_uci.c:400:24: note: format string is defined here MSG_VERB("Returning %lu bytes\n", to_copy); ~~^ %u vim +/pr_err +73 drivers/bus/mhi/devices/mhi_uci.c 70 71 #define MSG_VERB(fmt, ...) do { \ 72 if (msg_lvl <= MHI_MSG_LVL_VERBOSE) \ > 73 pr_err("[D][%s] " fmt, __func__, ##__VA_ARGS__); \ 74 } while (0) 75 76 #else 77 78 #define MSG_VERB(fmt, ...) 79 80 #endif 81 82 #define MSG_LOG(fmt, ...) do { \ 83 if (msg_lvl <= MHI_MSG_LVL_INFO) \ 84 pr_err("[I][%s] " fmt, __func__, ##__VA_ARGS__); \ 85 } while (0) 86 87 #define MSG_ERR(fmt, ...) do { \ 88 if (msg_lvl <= MHI_MSG_LVL_ERROR) \ > 89 pr_err("[E][%s] " fmt, __func__, ##__VA_ARGS__); \ 90 } while (0) 91 92 #define MAX_UCI_DEVICES (64) 93 94 static DECLARE_BITMAP(uci_minors, MAX_UCI_DEVICES); 95 static struct mhi_uci_drv mhi_uci_drv; 96 97 static int mhi_queue_inbound(struct uci_dev *uci_dev) 98 { 99 struct mhi_device *mhi_dev = uci_dev->mhi_dev; 100 int nr_trbs = mhi_get_no_free_descriptors(mhi_dev, DMA_FROM_DEVICE); 101 size_t mtu = uci_dev->mtu; 102 void *buf; 103 struct uci_buf *uci_buf; 104 int ret = -EIO, i; 105 106 for (i = 0; i < nr_trbs; i++) { 107 buf = kmalloc(mtu + sizeof(*uci_buf), GFP_KERNEL); 108 if (!buf) 109 return -ENOMEM; 110 111 uci_buf = buf + mtu; 112 uci_buf->data = buf; 113 > 114 MSG_VERB("Allocated buf %d of %d size %ld\n", i, nr_trbs, mtu); 115 116 ret = mhi_queue_transfer(mhi_dev, DMA_FROM_DEVICE, buf, mtu, 117 MHI_EOT); 118 if (ret) { 119 kfree(buf); 120 MSG_ERR("Failed to queue buffer %d\n", i); 121 return ret; 122 } 123 } 124 125 return ret; 126 } 127 128 static long mhi_uci_ioctl(struct file *file, 129 unsigned int cmd, 130 unsigned long arg) 131 { 132 struct uci_dev *uci_dev = file->private_data; 133 struct mhi_device *mhi_dev = uci_dev->mhi_dev; 134 long ret = -ERESTARTSYS; 135 136 mutex_lock(&uci_dev->mutex); 137 if (uci_dev->enabled) 138 ret = mhi_ioctl(mhi_dev, cmd, arg); 139 mutex_unlock(&uci_dev->mutex); 140 141 return ret; 142 } 143 144 static int mhi_uci_release(struct inode *inode, struct file *file) 145 { 146 struct uci_dev *uci_dev = file->private_data; 147 148 mutex_lock(&uci_dev->mutex); 149 uci_dev->ref_count--; 150 if (!uci_dev->ref_count) { 151 struct uci_buf *itr, *tmp; 152 struct uci_chan *uci_chan; 153 154 MSG_LOG("Last client left, closing node\n"); 155 156 if (uci_dev->enabled) 157 mhi_unprepare_from_transfer(uci_dev->mhi_dev); 158 159 /* clean inbound channel */ 160 uci_chan = &uci_dev->dl_chan; 161 list_for_each_entry_safe(itr, tmp, &uci_chan->pending, node) { 162 list_del(&itr->node); 163 kfree(itr->data); 164 } 165 if (uci_chan->cur_buf) 166 kfree(uci_chan->cur_buf->data); 167 168 uci_chan->cur_buf = NULL; 169 170 if (!uci_dev->enabled) { 171 MSG_LOG("Node is deleted, freeing dev node\n"); 172 mutex_unlock(&uci_dev->mutex); 173 mutex_destroy(&uci_dev->mutex); 174 clear_bit(MINOR(uci_dev->devt), uci_minors); 175 kfree(uci_dev); 176 return 0; 177 } 178 } 179 180 mutex_unlock(&uci_dev->mutex); 181 182 MSG_LOG("exit: ref_count:%d\n", uci_dev->ref_count); 183 184 return 0; 185 } 186 187 static unsigned int mhi_uci_poll(struct file *file, poll_table *wait) 188 { 189 struct uci_dev *uci_dev = file->private_data; 190 struct mhi_device *mhi_dev = uci_dev->mhi_dev; 191 struct uci_chan *uci_chan; 192 unsigned int mask = 0; 193 194 poll_wait(file, &uci_dev->dl_chan.wq, wait); 195 poll_wait(file, &uci_dev->ul_chan.wq, wait); 196 197 uci_chan = &uci_dev->dl_chan; 198 spin_lock_bh(&uci_chan->lock); 199 if (!uci_dev->enabled) { 200 mask = POLLERR; 201 } else if (!list_empty(&uci_chan->pending) || uci_chan->cur_buf) { 202 MSG_VERB("Client can read from node\n"); 203 mask |= POLLIN | POLLRDNORM; 204 } 205 spin_unlock_bh(&uci_chan->lock); 206 207 uci_chan = &uci_dev->ul_chan; 208 spin_lock_bh(&uci_chan->lock); 209 if (!uci_dev->enabled) { 210 mask |= POLLERR; 211 } else if (mhi_get_no_free_descriptors(mhi_dev, DMA_TO_DEVICE) > 0) { 212 MSG_VERB("Client can write to node\n"); 213 mask |= POLLOUT | POLLWRNORM; 214 } 215 spin_unlock_bh(&uci_chan->lock); 216 217 MSG_LOG("Client attempted to poll, returning mask 0x%x\n", mask); 218 219 return mask; 220 } 221 222 static ssize_t mhi_uci_write(struct file *file, 223 const char __user *buf, 224 size_t count, 225 loff_t *offp) 226 { 227 struct uci_dev *uci_dev = file->private_data; 228 struct mhi_device *mhi_dev = uci_dev->mhi_dev; 229 struct uci_chan *uci_chan = &uci_dev->ul_chan; 230 size_t bytes_xfered = 0; 231 int ret; 232 233 if (!buf || !count) 234 return -EINVAL; 235 236 /* confirm channel is active */ 237 spin_lock_bh(&uci_chan->lock); 238 if (!uci_dev->enabled) { 239 spin_unlock_bh(&uci_chan->lock); 240 return -ERESTARTSYS; 241 } 242 243 MSG_VERB("Enter: to xfer:%lu bytes\n", count); 244 245 while (count) { 246 size_t xfer_size; 247 void *kbuf; 248 enum MHI_FLAGS flags; 249 250 spin_unlock_bh(&uci_chan->lock); 251 252 /* wait for free descriptors */ 253 ret = wait_event_interruptible(uci_chan->wq, 254 (!uci_dev->enabled) || 255 mhi_get_no_free_descriptors 256 (mhi_dev, DMA_TO_DEVICE) > 0); 257 258 if (ret == -ERESTARTSYS) { 259 MSG_LOG("Exit signal caught for node\n"); 260 return -ERESTARTSYS; 261 } 262 263 xfer_size = min_t(size_t, count, uci_dev->mtu); 264 kbuf = kmalloc(xfer_size, GFP_KERNEL); 265 if (!kbuf) { > 266 MSG_ERR("Failed to allocate memory %lu\n", xfer_size); 267 return -ENOMEM; 268 } 269 270 ret = copy_from_user(kbuf, buf, xfer_size); 271 if (unlikely(ret)) { 272 kfree(kbuf); 273 return ret; 274 } 275 276 spin_lock_bh(&uci_chan->lock); 277 flags = (count - xfer_size) ? MHI_EOB : MHI_EOT; 278 if (uci_dev->enabled) 279 ret = mhi_queue_transfer(mhi_dev, DMA_TO_DEVICE, kbuf, 280 xfer_size, flags); 281 else 282 ret = -ERESTARTSYS; 283 284 if (ret) { 285 kfree(kbuf); 286 goto sys_interrupt; 287 } 288 289 bytes_xfered += xfer_size; 290 count -= xfer_size; 291 buf += xfer_size; 292 } 293 294 spin_unlock_bh(&uci_chan->lock); 295 MSG_VERB("Exit: Number of bytes xferred:%lu\n", bytes_xfered); 296 297 return bytes_xfered; 298 299 sys_interrupt: 300 spin_unlock_bh(&uci_chan->lock); 301 302 return ret; 303 } 304 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation