Commit c91b1869 authored by Malcolm Priestley's avatar Malcolm Priestley Committed by Greg Kroah-Hartman

staging: vt6656: lock changes: usbpipe.c add mutex lock.

PIPEnsControlOut and PIPEnsControlIn are nolonger
atomic but they do need a usb lock.

Add new mutex lock for these functions and PIPEnsControlOutAsyn.
Signed-off-by: default avatarMalcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 97641ca2
...@@ -363,6 +363,7 @@ struct vnt_private { ...@@ -363,6 +363,7 @@ struct vnt_private {
u8 byRxMode; u8 byRxMode;
spinlock_t lock; spinlock_t lock;
struct mutex usb_lock;
u32 rx_bytes; u32 rx_bytes;
......
...@@ -695,6 +695,8 @@ vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id) ...@@ -695,6 +695,8 @@ vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id)
device_set_options(pDevice); device_set_options(pDevice);
spin_lock_init(&pDevice->lock); spin_lock_init(&pDevice->lock);
mutex_init(&pDevice->usb_lock);
INIT_DELAYED_WORK(&pDevice->run_command_work, vRunCommand); INIT_DELAYED_WORK(&pDevice->run_command_work, vRunCommand);
INIT_DELAYED_WORK(&pDevice->second_callback_work, BSSvSecondCallBack); INIT_DELAYED_WORK(&pDevice->second_callback_work, BSSvSecondCallBack);
INIT_WORK(&pDevice->read_work_item, RXvWorkItem); INIT_WORK(&pDevice->read_work_item, RXvWorkItem);
......
...@@ -82,6 +82,8 @@ int PIPEnsControlOutAsyn(struct vnt_private *pDevice, u8 byRequest, ...@@ -82,6 +82,8 @@ int PIPEnsControlOutAsyn(struct vnt_private *pDevice, u8 byRequest,
return STATUS_FAILURE; return STATUS_FAILURE;
} }
mutex_lock(&pDevice->usb_lock);
ntStatus = usb_control_msg( ntStatus = usb_control_msg(
pDevice->usb, pDevice->usb,
usb_sndctrlpipe(pDevice->usb , 0), usb_sndctrlpipe(pDevice->usb , 0),
...@@ -100,6 +102,8 @@ int PIPEnsControlOutAsyn(struct vnt_private *pDevice, u8 byRequest, ...@@ -100,6 +102,8 @@ int PIPEnsControlOutAsyn(struct vnt_private *pDevice, u8 byRequest,
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"usb_sndctrlpipe fail, ntStatus= %d\n", ntStatus); DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"usb_sndctrlpipe fail, ntStatus= %d\n", ntStatus);
} }
mutex_unlock(&pDevice->usb_lock);
return ntStatus; return ntStatus;
} }
...@@ -123,6 +127,8 @@ int PIPEnsControlOut(struct vnt_private *pDevice, u8 byRequest, u16 wValue, ...@@ -123,6 +127,8 @@ int PIPEnsControlOut(struct vnt_private *pDevice, u8 byRequest, u16 wValue,
if (pDevice->pControlURB->hcpriv) if (pDevice->pControlURB->hcpriv)
return STATUS_FAILURE; return STATUS_FAILURE;
mutex_lock(&pDevice->usb_lock);
MP_SET_FLAG(pDevice, fMP_CONTROL_WRITES); MP_SET_FLAG(pDevice, fMP_CONTROL_WRITES);
pDevice->sUsbCtlRequest.bRequestType = 0x40; pDevice->sUsbCtlRequest.bRequestType = 0x40;
...@@ -143,6 +149,7 @@ int PIPEnsControlOut(struct vnt_private *pDevice, u8 byRequest, u16 wValue, ...@@ -143,6 +149,7 @@ int PIPEnsControlOut(struct vnt_private *pDevice, u8 byRequest, u16 wValue,
"control send request submission failed: %d\n", "control send request submission failed: %d\n",
ntStatus); ntStatus);
MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES); MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
mutex_unlock(&pDevice->usb_lock);
return STATUS_FAILURE; return STATUS_FAILURE;
} }
...@@ -157,10 +164,13 @@ int PIPEnsControlOut(struct vnt_private *pDevice, u8 byRequest, u16 wValue, ...@@ -157,10 +164,13 @@ int PIPEnsControlOut(struct vnt_private *pDevice, u8 byRequest, u16 wValue,
DBG_PRT(MSG_LEVEL_DEBUG, DBG_PRT(MSG_LEVEL_DEBUG,
KERN_INFO "control send request submission timeout\n"); KERN_INFO "control send request submission timeout\n");
MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES); MP_CLEAR_FLAG(pDevice, fMP_CONTROL_WRITES);
mutex_unlock(&pDevice->usb_lock);
return STATUS_FAILURE; return STATUS_FAILURE;
} }
} }
mutex_unlock(&pDevice->usb_lock);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
...@@ -184,6 +194,8 @@ int PIPEnsControlIn(struct vnt_private *pDevice, u8 byRequest, u16 wValue, ...@@ -184,6 +194,8 @@ int PIPEnsControlIn(struct vnt_private *pDevice, u8 byRequest, u16 wValue,
if (pDevice->pControlURB->hcpriv) if (pDevice->pControlURB->hcpriv)
return STATUS_FAILURE; return STATUS_FAILURE;
mutex_lock(&pDevice->usb_lock);
MP_SET_FLAG(pDevice, fMP_CONTROL_READS); MP_SET_FLAG(pDevice, fMP_CONTROL_READS);
pDevice->sUsbCtlRequest.bRequestType = 0xC0; pDevice->sUsbCtlRequest.bRequestType = 0xC0;
...@@ -202,6 +214,7 @@ int PIPEnsControlIn(struct vnt_private *pDevice, u8 byRequest, u16 wValue, ...@@ -202,6 +214,7 @@ int PIPEnsControlIn(struct vnt_private *pDevice, u8 byRequest, u16 wValue,
DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
"control request submission failed: %d\n", ntStatus); "control request submission failed: %d\n", ntStatus);
MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS); MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS);
mutex_unlock(&pDevice->usb_lock);
return STATUS_FAILURE; return STATUS_FAILURE;
} }
...@@ -216,10 +229,13 @@ int PIPEnsControlIn(struct vnt_private *pDevice, u8 byRequest, u16 wValue, ...@@ -216,10 +229,13 @@ int PIPEnsControlIn(struct vnt_private *pDevice, u8 byRequest, u16 wValue,
DBG_PRT(MSG_LEVEL_DEBUG, DBG_PRT(MSG_LEVEL_DEBUG,
KERN_INFO "control rcv request submission timeout\n"); KERN_INFO "control rcv request submission timeout\n");
MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS); MP_CLEAR_FLAG(pDevice, fMP_CONTROL_READS);
mutex_unlock(&pDevice->usb_lock);
return STATUS_FAILURE; return STATUS_FAILURE;
} }
} }
mutex_unlock(&pDevice->usb_lock);
return ntStatus; return ntStatus;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment