| .. | .. |
|---|
| 208 | 208 | EXPORT_SYMBOL_GPL(usb_find_common_endpoints_reverse); |
|---|
| 209 | 209 | |
|---|
| 210 | 210 | /** |
|---|
| 211 | + * usb_find_endpoint() - Given an endpoint address, search for the endpoint's |
|---|
| 212 | + * usb_host_endpoint structure in an interface's current altsetting. |
|---|
| 213 | + * @intf: the interface whose current altsetting should be searched |
|---|
| 214 | + * @ep_addr: the endpoint address (number and direction) to find |
|---|
| 215 | + * |
|---|
| 216 | + * Search the altsetting's list of endpoints for one with the specified address. |
|---|
| 217 | + * |
|---|
| 218 | + * Return: Pointer to the usb_host_endpoint if found, %NULL otherwise. |
|---|
| 219 | + */ |
|---|
| 220 | +static const struct usb_host_endpoint *usb_find_endpoint( |
|---|
| 221 | + const struct usb_interface *intf, unsigned int ep_addr) |
|---|
| 222 | +{ |
|---|
| 223 | + int n; |
|---|
| 224 | + const struct usb_host_endpoint *ep; |
|---|
| 225 | + |
|---|
| 226 | + n = intf->cur_altsetting->desc.bNumEndpoints; |
|---|
| 227 | + ep = intf->cur_altsetting->endpoint; |
|---|
| 228 | + for (; n > 0; (--n, ++ep)) { |
|---|
| 229 | + if (ep->desc.bEndpointAddress == ep_addr) |
|---|
| 230 | + return ep; |
|---|
| 231 | + } |
|---|
| 232 | + return NULL; |
|---|
| 233 | +} |
|---|
| 234 | + |
|---|
| 235 | +/** |
|---|
| 236 | + * usb_check_bulk_endpoints - Check whether an interface's current altsetting |
|---|
| 237 | + * contains a set of bulk endpoints with the given addresses. |
|---|
| 238 | + * @intf: the interface whose current altsetting should be searched |
|---|
| 239 | + * @ep_addrs: 0-terminated array of the endpoint addresses (number and |
|---|
| 240 | + * direction) to look for |
|---|
| 241 | + * |
|---|
| 242 | + * Search for endpoints with the specified addresses and check their types. |
|---|
| 243 | + * |
|---|
| 244 | + * Return: %true if all the endpoints are found and are bulk, %false otherwise. |
|---|
| 245 | + */ |
|---|
| 246 | +bool usb_check_bulk_endpoints( |
|---|
| 247 | + const struct usb_interface *intf, const u8 *ep_addrs) |
|---|
| 248 | +{ |
|---|
| 249 | + const struct usb_host_endpoint *ep; |
|---|
| 250 | + |
|---|
| 251 | + for (; *ep_addrs; ++ep_addrs) { |
|---|
| 252 | + ep = usb_find_endpoint(intf, *ep_addrs); |
|---|
| 253 | + if (!ep || !usb_endpoint_xfer_bulk(&ep->desc)) |
|---|
| 254 | + return false; |
|---|
| 255 | + } |
|---|
| 256 | + return true; |
|---|
| 257 | +} |
|---|
| 258 | +EXPORT_SYMBOL_GPL(usb_check_bulk_endpoints); |
|---|
| 259 | + |
|---|
| 260 | +/** |
|---|
| 261 | + * usb_check_int_endpoints - Check whether an interface's current altsetting |
|---|
| 262 | + * contains a set of interrupt endpoints with the given addresses. |
|---|
| 263 | + * @intf: the interface whose current altsetting should be searched |
|---|
| 264 | + * @ep_addrs: 0-terminated array of the endpoint addresses (number and |
|---|
| 265 | + * direction) to look for |
|---|
| 266 | + * |
|---|
| 267 | + * Search for endpoints with the specified addresses and check their types. |
|---|
| 268 | + * |
|---|
| 269 | + * Return: %true if all the endpoints are found and are interrupt, |
|---|
| 270 | + * %false otherwise. |
|---|
| 271 | + */ |
|---|
| 272 | +bool usb_check_int_endpoints( |
|---|
| 273 | + const struct usb_interface *intf, const u8 *ep_addrs) |
|---|
| 274 | +{ |
|---|
| 275 | + const struct usb_host_endpoint *ep; |
|---|
| 276 | + |
|---|
| 277 | + for (; *ep_addrs; ++ep_addrs) { |
|---|
| 278 | + ep = usb_find_endpoint(intf, *ep_addrs); |
|---|
| 279 | + if (!ep || !usb_endpoint_xfer_int(&ep->desc)) |
|---|
| 280 | + return false; |
|---|
| 281 | + } |
|---|
| 282 | + return true; |
|---|
| 283 | +} |
|---|
| 284 | +EXPORT_SYMBOL_GPL(usb_check_int_endpoints); |
|---|
| 285 | + |
|---|
| 286 | +/** |
|---|
| 211 | 287 | * usb_find_alt_setting() - Given a configuration, find the alternate setting |
|---|
| 212 | 288 | * for the given interface. |
|---|
| 213 | 289 | * @config: the configuration to search (not necessarily the current config). |
|---|