diff options
| author | Diego Ismirlian <dismirlian (at) google's mail.com> | 2017-07-16 20:01:50 -0300 | 
|---|---|---|
| committer | Diego Ismirlian <dismirlian (at) google's mail.com> | 2017-07-16 20:01:50 -0300 | 
| commit | dee22cee18dd98502b19e41e45503f8c20f447d6 (patch) | |
| tree | d077ac7d6e50dad2fc7ca3909f1d2c9451031e99 /os/hal/src | |
| parent | ce8f18291fb45048685be52bcff5088b14a6823c (diff) | |
| download | ChibiOS-Contrib-dee22cee18dd98502b19e41e45503f8c20f447d6.tar.gz ChibiOS-Contrib-dee22cee18dd98502b19e41e45503f8c20f447d6.tar.bz2 ChibiOS-Contrib-dee22cee18dd98502b19e41e45503f8c20f447d6.zip  | |
USBH: remove unnecessary reschedules and add necessary ones
Diffstat (limited to 'os/hal/src')
| -rw-r--r-- | os/hal/src/hal_usbh.c | 12 | ||||
| -rw-r--r-- | os/hal/src/usbh/TODO.txt | 2 | ||||
| -rw-r--r-- | os/hal/src/usbh/hal_usbh_aoa.c | 7 | ||||
| -rw-r--r-- | os/hal/src/usbh/hal_usbh_ftdi.c | 7 | ||||
| -rw-r--r-- | os/hal/src/usbh/hal_usbh_hid.c | 4 | ||||
| -rw-r--r-- | os/hal/src/usbh/hal_usbh_hub.c | 5 | ||||
| -rw-r--r-- | os/hal/src/usbh/hal_usbh_uvc.c | 8 | 
7 files changed, 17 insertions, 28 deletions
diff --git a/os/hal/src/hal_usbh.c b/os/hal/src/hal_usbh.c index d72ab8c..1aa35d0 100644 --- a/os/hal/src/hal_usbh.c +++ b/os/hal/src/hal_usbh.c @@ -111,7 +111,6 @@ void usbhStart(USBHDriver *usbh) {  				"invalid state");  	usbh_lld_start(usbh);  	usbh->status = USBH_STATUS_STARTED; -	osalOsRescheduleS();  	osalSysUnlock();  } @@ -224,6 +223,7 @@ void usbhURBObjectResetI(usbh_urb_t *urb) {  	usbh_lld_urb_object_reset(urb);  } +/* usbhURBSubmitI may require a reschedule if called from a S-locked state */  void usbhURBSubmitI(usbh_urb_t *urb) {  	osalDbgCheckClassI();  	_check_urb(urb); @@ -245,6 +245,7 @@ void usbhURBSubmitI(usbh_urb_t *urb) {  	usbh_lld_urb_submit(urb);  } +/* _usbh_urb_abortI may require a reschedule if called from a S-locked state */  bool _usbh_urb_abortI(usbh_urb_t *urb, usbh_urbstatus_t status) {  	osalDbgCheckClassI();  	_check_urb(urb); @@ -280,15 +281,18 @@ void _usbh_urb_abort_and_waitS(usbh_urb_t *urb, usbh_urbstatus_t status) {  	}  #if !(USBH_DEBUG_ENABLE && USBH_DEBUG_ENABLE_WARNINGS)  	else { +		/* This call is necessary because _usbh_urb_abortI may require a reschedule */  		osalOsRescheduleS();  	}  #else  	uwarn("URB aborted");  	osalOsRescheduleS();	/* debug printing functions call I-class functions inside -	 	 	 	 	 	 	 which may cause a priority violation without this call */ +	 	 	 	 	 	 	 which may cause a priority violation without this call +							Also, _usbh_urb_abortI may require a reschedule */  #endif  } +/* usbhURBCancelI may require a reschedule if called from a S-locked state */  bool usbhURBCancelI(usbh_urb_t *urb) {  	return _usbh_urb_abortI(urb, USBH_URBSTATUS_CANCELLED);  } @@ -313,7 +317,6 @@ msg_t usbhURBWaitTimeoutS(usbh_urb_t *urb, systime_t timeout) {  	case USBH_URBSTATUS_OK:  		ret = MSG_OK; -		osalOsRescheduleS();  		break;  /*	case USBH_URBSTATUS_UNINITIALIZED: @@ -324,7 +327,6 @@ msg_t usbhURBWaitTimeoutS(usbh_urb_t *urb, systime_t timeout) {   *	case USBH_URBSTATUS_DISCONNECTED: */  	default:  		ret = MSG_RESET; -		osalOsRescheduleS();  		break;  	}  	return ret; @@ -350,6 +352,7 @@ static inline msg_t _wakeup_message(usbh_urbstatus_t status) {  	return MSG_RESET;  } +/* _usbh_urb_completeI may require a reschedule if called from a S-locked state */  void _usbh_urb_completeI(usbh_urb_t *urb, usbh_urbstatus_t status) {  	osalDbgCheckClassI();  	_check_urb(urb); @@ -1128,7 +1131,6 @@ static uint32_t _hub_get_status_change_bitmap(USBHDriver *host, USBHHubDriver *h  		osalSysLock();  		uint32_t ret = hub->statuschange;  		hub->statuschange = 0; -		osalOsRescheduleS();  		osalSysUnlock();  		return ret;  	} diff --git a/os/hal/src/usbh/TODO.txt b/os/hal/src/usbh/TODO.txt index c3dd4a8..532420b 100644 --- a/os/hal/src/usbh/TODO.txt +++ b/os/hal/src/usbh/TODO.txt @@ -17,5 +17,5 @@ Enhancements:  - Linked list for drivers for dynamic registration  - A way to automate matching (similar to linux)  - Hooks to override driver loading and to inform the user of problems - +- for STM32 LLD: think of a way to prevent Bulk IN NAK interrupt flood. diff --git a/os/hal/src/usbh/hal_usbh_aoa.c b/os/hal/src/usbh/hal_usbh_aoa.c index 1526aa3..b8e37ae 100644 --- a/os/hal/src/usbh/hal_usbh_aoa.c +++ b/os/hal/src/usbh/hal_usbh_aoa.c @@ -295,7 +295,6 @@ static void _aoa_unload(usbh_baseclassdriver_t *drv) {  	_stop_channelS(&aoap->channel);  	aoap->channel.state = USBHAOA_CHANNEL_STATE_STOP;  	aoap->state = USBHAOA_STATE_STOP; -	osalOsRescheduleS();  	osalSysUnlock();  } @@ -521,6 +520,7 @@ static void _stop_channelS(USBHAOAChannel *aoacp) {  	chThdDequeueAllI(&aoacp->oq_waiting, Q_RESET);  	chnAddFlagsI(aoacp, CHN_DISCONNECTED);  	aoacp->state = USBHAOA_CHANNEL_STATE_ACTIVE; +	osalOsRescheduleS();  }  static void _vt(void *p) { @@ -562,9 +562,7 @@ void usbhaoaChannelStart(USBHAOADriver *aoap) {  	aoacp->iq_counter = 0;  	aoacp->iq_ptr = aoacp->iq_buff;  	usbhEPOpen(&aoacp->epin); -	osalSysLock(); -	usbhURBSubmitI(&aoacp->iq_urb); -	osalSysUnlock(); +	usbhURBSubmit(&aoacp->iq_urb);  	chVTObjectInit(&aoacp->vt);  	chVTSet(&aoacp->vt, MS2ST(16), _vt, aoacp); @@ -579,7 +577,6 @@ void usbhaoaChannelStop(USBHAOADriver *aoap) {  			|| (aoap->channel.state == USBHAOA_CHANNEL_STATE_READY));  	osalSysLock();  	_stop_channelS(&aoap->channel); -	osalOsRescheduleS();  	osalSysUnlock();  } diff --git a/os/hal/src/usbh/hal_usbh_ftdi.c b/os/hal/src/usbh/hal_usbh_ftdi.c index edcf022..2e9f506 100644 --- a/os/hal/src/usbh/hal_usbh_ftdi.c +++ b/os/hal/src/usbh/hal_usbh_ftdi.c @@ -219,7 +219,6 @@ static void _ftdi_unload(usbh_baseclassdriver_t *drv) {  	while (ftdipp) {  		osalSysLock();  		_stopS(ftdipp); -		osalOsRescheduleS();  		osalSysUnlock();  		ftdipp = ftdipp->next;  	} @@ -636,6 +635,7 @@ static void _stopS(USBHFTDIPortDriver *ftdipp) {  	chThdDequeueAllI(&ftdipp->iq_waiting, Q_RESET);  	chThdDequeueAllI(&ftdipp->oq_waiting, Q_RESET);  	ftdipp->state = USBHFTDIP_STATE_ACTIVE; +	osalOsRescheduleS();  }  void usbhftdipStop(USBHFTDIPortDriver *ftdipp) { @@ -646,7 +646,6 @@ void usbhftdipStop(USBHFTDIPortDriver *ftdipp) {  	chMtxLockS(&ftdipp->ftdip->mtx);  	_stopS(ftdipp);  	chMtxUnlockS(&ftdipp->ftdip->mtx); -	osalOsRescheduleS();  	osalSysUnlock();  } @@ -688,9 +687,7 @@ void usbhftdipStart(USBHFTDIPortDriver *ftdipp, const USBHFTDIPortConfig *config  	ftdipp->iq_counter = 0;  	ftdipp->iq_ptr = ftdipp->iq_buff;  	usbhEPOpen(&ftdipp->epin); -	osalSysLock(); -	usbhURBSubmitI(&ftdipp->iq_urb); -	osalSysUnlock(); +	usbhURBSubmit(&ftdipp->iq_urb);  	chVTObjectInit(&ftdipp->vt);  	chVTSet(&ftdipp->vt, MS2ST(16), _vt, ftdipp); diff --git a/os/hal/src/usbh/hal_usbh_hid.c b/os/hal/src/usbh/hal_usbh_hid.c index 575b0a6..2b2c5ce 100644 --- a/os/hal/src/usbh/hal_usbh_hid.c +++ b/os/hal/src/usbh/hal_usbh_hid.c @@ -244,9 +244,7 @@ void usbhhidStart(USBHHIDDriver *hidp, const USBHHIDConfig *cfg) {  	usbhhidSetProtocol(hidp, cfg->protocol); -	osalSysLock(); -	usbhURBSubmitI(&hidp->in_urb); -	osalSysUnlock(); +	usbhURBSubmit(&hidp->in_urb);  	hidp->state = USBHHID_STATE_READY;  	chSemSignal(&hidp->sem); diff --git a/os/hal/src/usbh/hal_usbh_hub.c b/os/hal/src/usbh/hal_usbh_hub.c index f9b6418..6a83c66 100644 --- a/os/hal/src/usbh/hal_usbh_hub.c +++ b/os/hal/src/usbh/hal_usbh_hub.c @@ -252,10 +252,7 @@ alloc_ok:  			_urb_complete, hubdp, hubdp->scbuff,  			(hubdesc->bNbrPorts + 8) / 8); -	osalSysLock(); -	usbhURBSubmitI(&hubdp->urb); -	osalOsRescheduleS(); -	osalSysUnlock(); +	usbhURBSubmit(&hubdp->urb);  	hubdp->dev = NULL;  	return (usbh_baseclassdriver_t *)hubdp; diff --git a/os/hal/src/usbh/hal_usbh_uvc.c b/os/hal/src/usbh/hal_usbh_uvc.c index 7777823..a795cd8 100644 --- a/os/hal/src/usbh/hal_usbh_uvc.c +++ b/os/hal/src/usbh/hal_usbh_uvc.c @@ -361,10 +361,8 @@ bool usbhuvcStreamStart(USBHUVCDriver *uvcdp, uint16_t min_ep_sz) {  		osalDbgCheck(msg);  		usbhURBObjectInit(&uvcdp->urb_iso, &uvcdp->ep_iso, _cb_iso, uvcdp, msg->data, uvcdp->ep_iso.wMaxPacketSize);  	} -	osalSysLock(); -	usbhURBSubmitI(&uvcdp->urb_iso); -	osalOsRescheduleS(); -	osalSysUnlock(); + +	usbhURBSubmit(&uvcdp->urb_iso);  	ret = HAL_SUCCESS;  	goto exit; @@ -695,7 +693,7 @@ alloc_ok:  	osalSysLock();  	usbhURBSubmitI(&uvcdp->urb_int);  	uvcdp->state = USBHUVC_STATE_ACTIVE; -	osalOsRescheduleS(); +	osalOsRescheduleS();	/* because of usbhURBSubmitI */  	osalSysUnlock();  	dev->keepFullCfgDesc++;  | 
