usb: gadget: Use atomic operations to access online and error flags
Signed-off-by: Manu Gautam <mgautam@codeaurora.org>
diff --git a/drivers/usb/gadget/f_adb.c b/drivers/usb/gadget/f_adb.c
index fe4455e..cae0136 100644
--- a/drivers/usb/gadget/f_adb.c
+++ b/drivers/usb/gadget/f_adb.c
@@ -42,8 +42,8 @@
struct usb_ep *ep_in;
struct usb_ep *ep_out;
- int online;
- int error;
+ atomic_t online;
+ atomic_t error;
atomic_t read_excl;
atomic_t write_excl;
@@ -193,7 +193,7 @@
struct adb_dev *dev = _adb_dev;
if (req->status != 0)
- dev->error = 1;
+ atomic_set(&dev->error, 1);
adb_req_put(dev, &dev->tx_idle, req);
@@ -206,7 +206,7 @@
dev->rx_done = 1;
if (req->status != 0)
- dev->error = 1;
+ atomic_set(&dev->error, 1);
wake_up(&dev->read_wq);
}
@@ -281,16 +281,17 @@
return -EBUSY;
/* we will block until we're online */
- while (!(dev->online || dev->error)) {
+ while (!(atomic_read(&dev->online) || atomic_read(&dev->error))) {
pr_debug("adb_read: waiting for online state\n");
ret = wait_event_interruptible(dev->read_wq,
- (dev->online || dev->error));
+ (atomic_read(&dev->online) ||
+ atomic_read(&dev->error)));
if (ret < 0) {
adb_unlock(&dev->read_excl);
return ret;
}
}
- if (dev->error) {
+ if (atomic_read(&dev->error)) {
r = -EIO;
goto done;
}
@@ -304,7 +305,7 @@
if (ret < 0) {
pr_debug("adb_read: failed to queue req %p (%d)\n", req, ret);
r = -EIO;
- dev->error = 1;
+ atomic_set(&dev->error, 1);
goto done;
} else {
pr_debug("rx %p queue\n", req);
@@ -313,12 +314,12 @@
/* wait for a request to complete */
ret = wait_event_interruptible(dev->read_wq, dev->rx_done);
if (ret < 0) {
- dev->error = 1;
+ atomic_set(&dev->error, 1);
r = ret;
usb_ep_dequeue(dev->ep_out, req);
goto done;
}
- if (!dev->error) {
+ if (!atomic_read(&dev->error)) {
/* If we got a 0-len packet, throw it back and try again. */
if (req->actual == 0)
goto requeue_req;
@@ -353,7 +354,7 @@
return -EBUSY;
while (count > 0) {
- if (dev->error) {
+ if (atomic_read(&dev->error)) {
pr_debug("adb_write dev->error\n");
r = -EIO;
break;
@@ -362,7 +363,8 @@
/* get an idle tx request to use */
req = 0;
ret = wait_event_interruptible(dev->write_wq,
- (req = adb_req_get(dev, &dev->tx_idle)) || dev->error);
+ ((req = adb_req_get(dev, &dev->tx_idle)) ||
+ atomic_read(&dev->error)));
if (ret < 0) {
r = ret;
@@ -383,7 +385,7 @@
ret = usb_ep_queue(dev->ep_in, req, GFP_ATOMIC);
if (ret < 0) {
pr_debug("adb_write: xfer error %d\n", ret);
- dev->error = 1;
+ atomic_set(&dev->error, 1);
r = -EIO;
break;
}
@@ -416,7 +418,7 @@
fp->private_data = _adb_dev;
/* clear the error latch */
- _adb_dev->error = 0;
+ atomic_set(&_adb_dev->error, 0);
return 0;
}
@@ -490,8 +492,8 @@
struct usb_request *req;
- dev->online = 0;
- dev->error = 1;
+ atomic_set(&dev->online, 0);
+ atomic_set(&dev->error, 1);
wake_up(&dev->read_wq);
@@ -522,7 +524,7 @@
usb_ep_disable(dev->ep_in);
return ret;
}
- dev->online = 1;
+ atomic_set(&dev->online, 1);
/* readers may be blocked waiting for us to go online */
wake_up(&dev->read_wq);
@@ -535,8 +537,8 @@
struct usb_composite_dev *cdev = dev->cdev;
DBG(cdev, "adb_function_disable cdev %p\n", cdev);
- dev->online = 0;
- dev->error = 1;
+ atomic_set(&dev->online, 0);
+ atomic_set(&dev->error, 1);
usb_ep_disable(dev->ep_in);
usb_ep_disable(dev->ep_out);