1034d7c13SKuninori Morimoto /* 2034d7c13SKuninori Morimoto * Renesas USB driver 3034d7c13SKuninori Morimoto * 4034d7c13SKuninori Morimoto * Copyright (C) 2011 Renesas Solutions Corp. 5034d7c13SKuninori Morimoto * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 6034d7c13SKuninori Morimoto * 7034d7c13SKuninori Morimoto * This program is distributed in the hope that it will be useful, 8034d7c13SKuninori Morimoto * but WITHOUT ANY WARRANTY; without even the implied warranty of 9034d7c13SKuninori Morimoto * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10034d7c13SKuninori Morimoto * GNU General Public License for more details. 11034d7c13SKuninori Morimoto * 12034d7c13SKuninori Morimoto * You should have received a copy of the GNU General Public License 13034d7c13SKuninori Morimoto * along with this program; if not, write to the Free Software 14034d7c13SKuninori Morimoto * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 15034d7c13SKuninori Morimoto * 16034d7c13SKuninori Morimoto */ 17034d7c13SKuninori Morimoto #include <linux/io.h> 18034d7c13SKuninori Morimoto #include <linux/list.h> 19034d7c13SKuninori Morimoto #include <linux/module.h> 20034d7c13SKuninori Morimoto #include <linux/platform_device.h> 21034d7c13SKuninori Morimoto #include <linux/slab.h> 22034d7c13SKuninori Morimoto #include <linux/usb.h> 23034d7c13SKuninori Morimoto #include <linux/usb/hcd.h> 24034d7c13SKuninori Morimoto #include "common.h" 25034d7c13SKuninori Morimoto 26034d7c13SKuninori Morimoto /* 27034d7c13SKuninori Morimoto *** HARDWARE LIMITATION *** 28034d7c13SKuninori Morimoto * 29034d7c13SKuninori Morimoto * 1) renesas_usbhs has a limited number of controllable devices. 30034d7c13SKuninori Morimoto * it can control only 9 devices in generally. 31034d7c13SKuninori Morimoto * see DEVADDn / DCPMAXP / PIPEMAXP. 32034d7c13SKuninori Morimoto * 33034d7c13SKuninori Morimoto * 2) renesas_usbhs pipe number is limited. 34034d7c13SKuninori Morimoto * the pipe will be re-used for each devices. 35034d7c13SKuninori Morimoto * so, software should control DATA0/1 sequence of each devices. 36034d7c13SKuninori Morimoto */ 37034d7c13SKuninori Morimoto 38034d7c13SKuninori Morimoto 39034d7c13SKuninori Morimoto /* 40034d7c13SKuninori Morimoto * image of mod_host 41034d7c13SKuninori Morimoto * 42034d7c13SKuninori Morimoto * +--------+ 43034d7c13SKuninori Morimoto * | udev 0 | --> it is used when set address 44034d7c13SKuninori Morimoto * +--------+ 45034d7c13SKuninori Morimoto * 46034d7c13SKuninori Morimoto * +--------+ pipes are reused for each uep. 47034d7c13SKuninori Morimoto * | udev 1 |-+- [uep 0 (dcp) ] --+ pipe will be switched when 48034d7c13SKuninori Morimoto * +--------+ | | target device was changed 49034d7c13SKuninori Morimoto * +- [uep 1 (bulk)] --|---+ +--------------+ 50034d7c13SKuninori Morimoto * | +--------------> | pipe0 (dcp) | 51034d7c13SKuninori Morimoto * +- [uep 2 (bulk)] --|---|---+ +--------------+ 52034d7c13SKuninori Morimoto * | | | | pipe1 (isoc) | 53034d7c13SKuninori Morimoto * +--------+ | | | +--------------+ 54034d7c13SKuninori Morimoto * | udev 2 |-+- [uep 0 (dcp) ] --+ +-- |------> | pipe2 (bulk) | 55034d7c13SKuninori Morimoto * +--------+ | | | | +--------------+ 56034d7c13SKuninori Morimoto * +- [uep 1 (int) ] --|-+ | +------> | pipe3 (bulk) | 57034d7c13SKuninori Morimoto * | | | | +--------------+ 58034d7c13SKuninori Morimoto * +--------+ | +-|---|------> | pipe4 (int) | 59034d7c13SKuninori Morimoto * | udev 3 |-+- [uep 0 (dcp) ] --+ | | +--------------+ 60034d7c13SKuninori Morimoto * +--------+ | | | | .... | 61034d7c13SKuninori Morimoto * +- [uep 1 (bulk)] ------+ | | .... | 62034d7c13SKuninori Morimoto * | | 63034d7c13SKuninori Morimoto * +- [uep 2 (bulk)]-----------+ 64034d7c13SKuninori Morimoto */ 65034d7c13SKuninori Morimoto 66034d7c13SKuninori Morimoto 67034d7c13SKuninori Morimoto /* 68034d7c13SKuninori Morimoto * struct 69034d7c13SKuninori Morimoto */ 70034d7c13SKuninori Morimoto struct usbhsh_pipe_info { 71034d7c13SKuninori Morimoto unsigned int usr_cnt; /* see usbhsh_endpoint_alloc() */ 72034d7c13SKuninori Morimoto }; 73034d7c13SKuninori Morimoto 74034d7c13SKuninori Morimoto struct usbhsh_request { 75034d7c13SKuninori Morimoto struct urb *urb; 76034d7c13SKuninori Morimoto struct usbhs_pkt pkt; 77034d7c13SKuninori Morimoto struct list_head ureq_link; /* see hpriv :: ureq_link_xxx */ 78034d7c13SKuninori Morimoto }; 79034d7c13SKuninori Morimoto 80034d7c13SKuninori Morimoto struct usbhsh_device { 81034d7c13SKuninori Morimoto struct usb_device *usbv; 82034d7c13SKuninori Morimoto struct list_head ep_list_head; /* list of usbhsh_ep */ 83034d7c13SKuninori Morimoto }; 84034d7c13SKuninori Morimoto 85034d7c13SKuninori Morimoto struct usbhsh_ep { 86034d7c13SKuninori Morimoto struct usbhs_pipe *pipe; 87034d7c13SKuninori Morimoto struct usbhsh_device *udev; /* attached udev */ 88034d7c13SKuninori Morimoto struct list_head ep_list; /* list to usbhsh_device */ 89034d7c13SKuninori Morimoto 90034d7c13SKuninori Morimoto int maxp; 91034d7c13SKuninori Morimoto }; 92034d7c13SKuninori Morimoto 93034d7c13SKuninori Morimoto #define USBHSH_DEVICE_MAX 10 /* see DEVADDn / DCPMAXP / PIPEMAXP */ 94034d7c13SKuninori Morimoto #define USBHSH_PORT_MAX 7 /* see DEVADDn :: HUBPORT */ 95034d7c13SKuninori Morimoto struct usbhsh_hpriv { 96034d7c13SKuninori Morimoto struct usbhs_mod mod; 97034d7c13SKuninori Morimoto struct usbhs_pipe *dcp; 98034d7c13SKuninori Morimoto 99034d7c13SKuninori Morimoto struct usbhsh_device udev[USBHSH_DEVICE_MAX]; 100034d7c13SKuninori Morimoto 101034d7c13SKuninori Morimoto struct usbhsh_pipe_info *pipe_info; 102034d7c13SKuninori Morimoto int pipe_size; 103034d7c13SKuninori Morimoto 104034d7c13SKuninori Morimoto u32 port_stat; /* USB_PORT_STAT_xxx */ 105034d7c13SKuninori Morimoto 106034d7c13SKuninori Morimoto struct completion *done; 107034d7c13SKuninori Morimoto 108034d7c13SKuninori Morimoto /* see usbhsh_req_alloc/free */ 109034d7c13SKuninori Morimoto struct list_head ureq_link_active; 110034d7c13SKuninori Morimoto struct list_head ureq_link_free; 111034d7c13SKuninori Morimoto }; 112034d7c13SKuninori Morimoto 113034d7c13SKuninori Morimoto 114034d7c13SKuninori Morimoto static const char usbhsh_hcd_name[] = "renesas_usbhs host"; 115034d7c13SKuninori Morimoto 116034d7c13SKuninori Morimoto /* 117034d7c13SKuninori Morimoto * macro 118034d7c13SKuninori Morimoto */ 119034d7c13SKuninori Morimoto #define usbhsh_priv_to_hpriv(priv) \ 120034d7c13SKuninori Morimoto container_of(usbhs_mod_get(priv, USBHS_HOST), struct usbhsh_hpriv, mod) 121034d7c13SKuninori Morimoto 122034d7c13SKuninori Morimoto #define __usbhsh_for_each_hpipe(start, pos, h, i) \ 123034d7c13SKuninori Morimoto for (i = start, pos = (h)->hpipe + i; \ 124034d7c13SKuninori Morimoto i < (h)->hpipe_size; \ 125034d7c13SKuninori Morimoto i++, pos = (h)->hpipe + i) 126034d7c13SKuninori Morimoto 127034d7c13SKuninori Morimoto #define usbhsh_for_each_hpipe(pos, hpriv, i) \ 128034d7c13SKuninori Morimoto __usbhsh_for_each_hpipe(1, pos, hpriv, i) 129034d7c13SKuninori Morimoto 130034d7c13SKuninori Morimoto #define usbhsh_for_each_hpipe_with_dcp(pos, hpriv, i) \ 131034d7c13SKuninori Morimoto __usbhsh_for_each_hpipe(0, pos, hpriv, i) 132034d7c13SKuninori Morimoto 133034d7c13SKuninori Morimoto #define __usbhsh_for_each_udev(start, pos, h, i) \ 134034d7c13SKuninori Morimoto for (i = start, pos = (h)->udev + i; \ 135034d7c13SKuninori Morimoto i < USBHSH_DEVICE_MAX; \ 136034d7c13SKuninori Morimoto i++, pos = (h)->udev + i) 137034d7c13SKuninori Morimoto 138034d7c13SKuninori Morimoto #define usbhsh_for_each_udev(pos, hpriv, i) \ 139034d7c13SKuninori Morimoto __usbhsh_for_each_udev(1, pos, hpriv, i) 140034d7c13SKuninori Morimoto 141034d7c13SKuninori Morimoto #define usbhsh_for_each_udev_with_dev0(pos, hpriv, i) \ 142034d7c13SKuninori Morimoto __usbhsh_for_each_udev(0, pos, hpriv, i) 143034d7c13SKuninori Morimoto 144034d7c13SKuninori Morimoto #define usbhsh_hcd_to_hpriv(h) (struct usbhsh_hpriv *)((h)->hcd_priv) 145034d7c13SKuninori Morimoto #define usbhsh_hcd_to_dev(h) ((h)->self.controller) 146034d7c13SKuninori Morimoto 147034d7c13SKuninori Morimoto #define usbhsh_hpriv_to_priv(h) ((h)->mod.priv) 148034d7c13SKuninori Morimoto #define usbhsh_hpriv_to_dcp(h) ((h)->dcp) 149034d7c13SKuninori Morimoto #define usbhsh_hpriv_to_hcd(h) \ 150034d7c13SKuninori Morimoto container_of((void *)h, struct usb_hcd, hcd_priv) 151034d7c13SKuninori Morimoto 152034d7c13SKuninori Morimoto #define usbhsh_ep_to_uep(u) ((u)->hcpriv) 153034d7c13SKuninori Morimoto #define usbhsh_uep_to_pipe(u) ((u)->pipe) 154034d7c13SKuninori Morimoto #define usbhsh_uep_to_udev(u) ((u)->udev) 155034d7c13SKuninori Morimoto #define usbhsh_urb_to_ureq(u) ((u)->hcpriv) 156034d7c13SKuninori Morimoto #define usbhsh_urb_to_usbv(u) ((u)->dev) 157034d7c13SKuninori Morimoto 158034d7c13SKuninori Morimoto #define usbhsh_usbv_to_udev(d) dev_get_drvdata(&(d)->dev) 159034d7c13SKuninori Morimoto 160034d7c13SKuninori Morimoto #define usbhsh_udev_to_usbv(h) ((h)->usbv) 161034d7c13SKuninori Morimoto 162034d7c13SKuninori Morimoto #define usbhsh_pipe_info(p) ((p)->mod_private) 163034d7c13SKuninori Morimoto 164034d7c13SKuninori Morimoto #define usbhsh_device_number(h, d) ((int)((d) - (h)->udev)) 165034d7c13SKuninori Morimoto #define usbhsh_device_nth(h, d) ((h)->udev + d) 166034d7c13SKuninori Morimoto #define usbhsh_device0(h) usbhsh_device_nth(h, 0) 167034d7c13SKuninori Morimoto 168034d7c13SKuninori Morimoto #define usbhsh_port_stat_init(h) ((h)->port_stat = 0) 169034d7c13SKuninori Morimoto #define usbhsh_port_stat_set(h, s) ((h)->port_stat |= (s)) 170034d7c13SKuninori Morimoto #define usbhsh_port_stat_clear(h, s) ((h)->port_stat &= ~(s)) 171034d7c13SKuninori Morimoto #define usbhsh_port_stat_get(h) ((h)->port_stat) 172034d7c13SKuninori Morimoto 173034d7c13SKuninori Morimoto #define usbhsh_pkt_to_req(p) \ 174034d7c13SKuninori Morimoto container_of((void *)p, struct usbhsh_request, pkt) 175034d7c13SKuninori Morimoto 176034d7c13SKuninori Morimoto /* 177034d7c13SKuninori Morimoto * req alloc/free 178034d7c13SKuninori Morimoto */ 179034d7c13SKuninori Morimoto static void usbhsh_req_list_init(struct usbhsh_hpriv *hpriv) 180034d7c13SKuninori Morimoto { 181034d7c13SKuninori Morimoto INIT_LIST_HEAD(&hpriv->ureq_link_active); 182034d7c13SKuninori Morimoto INIT_LIST_HEAD(&hpriv->ureq_link_free); 183034d7c13SKuninori Morimoto } 184034d7c13SKuninori Morimoto 185034d7c13SKuninori Morimoto static void usbhsh_req_list_quit(struct usbhsh_hpriv *hpriv) 186034d7c13SKuninori Morimoto { 187034d7c13SKuninori Morimoto struct usb_hcd *hcd = usbhsh_hpriv_to_hcd(hpriv); 188034d7c13SKuninori Morimoto struct device *dev = usbhsh_hcd_to_dev(hcd); 189034d7c13SKuninori Morimoto struct usbhsh_request *ureq, *next; 190034d7c13SKuninori Morimoto 191034d7c13SKuninori Morimoto /* kfree all active ureq */ 192034d7c13SKuninori Morimoto list_for_each_entry_safe(ureq, next, 193034d7c13SKuninori Morimoto &hpriv->ureq_link_active, 194034d7c13SKuninori Morimoto ureq_link) { 195034d7c13SKuninori Morimoto dev_err(dev, "active ureq (%p) is force freed\n", ureq); 196034d7c13SKuninori Morimoto kfree(ureq); 197034d7c13SKuninori Morimoto } 198034d7c13SKuninori Morimoto 199034d7c13SKuninori Morimoto /* kfree all free ureq */ 200034d7c13SKuninori Morimoto list_for_each_entry_safe(ureq, next, &hpriv->ureq_link_free, ureq_link) 201034d7c13SKuninori Morimoto kfree(ureq); 202034d7c13SKuninori Morimoto } 203034d7c13SKuninori Morimoto 204034d7c13SKuninori Morimoto static struct usbhsh_request *usbhsh_req_alloc(struct usbhsh_hpriv *hpriv, 205034d7c13SKuninori Morimoto struct urb *urb, 206034d7c13SKuninori Morimoto gfp_t mem_flags) 207034d7c13SKuninori Morimoto { 208034d7c13SKuninori Morimoto struct usbhsh_request *ureq; 209034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 210034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 211034d7c13SKuninori Morimoto 212034d7c13SKuninori Morimoto if (list_empty(&hpriv->ureq_link_free)) { 213034d7c13SKuninori Morimoto /* 214034d7c13SKuninori Morimoto * create new one if there is no free ureq 215034d7c13SKuninori Morimoto */ 216034d7c13SKuninori Morimoto ureq = kzalloc(sizeof(struct usbhsh_request), mem_flags); 217034d7c13SKuninori Morimoto if (ureq) 218034d7c13SKuninori Morimoto INIT_LIST_HEAD(&ureq->ureq_link); 219034d7c13SKuninori Morimoto } else { 220034d7c13SKuninori Morimoto /* 221034d7c13SKuninori Morimoto * reuse "free" ureq if exist 222034d7c13SKuninori Morimoto */ 223034d7c13SKuninori Morimoto ureq = list_entry(hpriv->ureq_link_free.next, 224034d7c13SKuninori Morimoto struct usbhsh_request, 225034d7c13SKuninori Morimoto ureq_link); 226034d7c13SKuninori Morimoto if (ureq) 227034d7c13SKuninori Morimoto list_del_init(&ureq->ureq_link); 228034d7c13SKuninori Morimoto } 229034d7c13SKuninori Morimoto 230034d7c13SKuninori Morimoto if (!ureq) { 231034d7c13SKuninori Morimoto dev_err(dev, "ureq alloc fail\n"); 232034d7c13SKuninori Morimoto return NULL; 233034d7c13SKuninori Morimoto } 234034d7c13SKuninori Morimoto 235034d7c13SKuninori Morimoto usbhs_pkt_init(&ureq->pkt); 236034d7c13SKuninori Morimoto 237034d7c13SKuninori Morimoto /* 238034d7c13SKuninori Morimoto * push it to "active" list 239034d7c13SKuninori Morimoto */ 240034d7c13SKuninori Morimoto list_add_tail(&ureq->ureq_link, &hpriv->ureq_link_active); 241034d7c13SKuninori Morimoto ureq->urb = urb; 242034d7c13SKuninori Morimoto 243034d7c13SKuninori Morimoto return ureq; 244034d7c13SKuninori Morimoto } 245034d7c13SKuninori Morimoto 246034d7c13SKuninori Morimoto static void usbhsh_req_free(struct usbhsh_hpriv *hpriv, 247034d7c13SKuninori Morimoto struct usbhsh_request *ureq) 248034d7c13SKuninori Morimoto { 249034d7c13SKuninori Morimoto struct usbhs_pkt *pkt = &ureq->pkt; 250034d7c13SKuninori Morimoto 251034d7c13SKuninori Morimoto usbhs_pkt_init(pkt); 252034d7c13SKuninori Morimoto 253034d7c13SKuninori Morimoto /* 254034d7c13SKuninori Morimoto * removed from "active" list, 255034d7c13SKuninori Morimoto * and push it to "free" list 256034d7c13SKuninori Morimoto */ 257034d7c13SKuninori Morimoto ureq->urb = NULL; 258034d7c13SKuninori Morimoto list_del_init(&ureq->ureq_link); 259034d7c13SKuninori Morimoto list_add_tail(&ureq->ureq_link, &hpriv->ureq_link_free); 260034d7c13SKuninori Morimoto } 261034d7c13SKuninori Morimoto 262034d7c13SKuninori Morimoto /* 263034d7c13SKuninori Morimoto * device control 264034d7c13SKuninori Morimoto */ 265034d7c13SKuninori Morimoto 266034d7c13SKuninori Morimoto static int usbhsh_device_has_endpoint(struct usbhsh_device *udev) 267034d7c13SKuninori Morimoto { 268034d7c13SKuninori Morimoto return !list_empty(&udev->ep_list_head); 269034d7c13SKuninori Morimoto } 270034d7c13SKuninori Morimoto 271034d7c13SKuninori Morimoto static struct usbhsh_device *usbhsh_device_alloc(struct usbhsh_hpriv *hpriv, 272034d7c13SKuninori Morimoto struct urb *urb) 273034d7c13SKuninori Morimoto { 274034d7c13SKuninori Morimoto struct usbhsh_device *udev = NULL; 275034d7c13SKuninori Morimoto struct usb_hcd *hcd = usbhsh_hpriv_to_hcd(hpriv); 276034d7c13SKuninori Morimoto struct device *dev = usbhsh_hcd_to_dev(hcd); 277034d7c13SKuninori Morimoto struct usb_device *usbv = usbhsh_urb_to_usbv(urb); 278034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 279034d7c13SKuninori Morimoto int i; 280034d7c13SKuninori Morimoto 281034d7c13SKuninori Morimoto /* 282034d7c13SKuninori Morimoto * device 0 283034d7c13SKuninori Morimoto */ 284034d7c13SKuninori Morimoto if (0 == usb_pipedevice(urb->pipe)) { 285034d7c13SKuninori Morimoto udev = usbhsh_device0(hpriv); 286034d7c13SKuninori Morimoto goto usbhsh_device_find; 287034d7c13SKuninori Morimoto } 288034d7c13SKuninori Morimoto 289034d7c13SKuninori Morimoto /* 290034d7c13SKuninori Morimoto * find unused device 291034d7c13SKuninori Morimoto */ 292034d7c13SKuninori Morimoto usbhsh_for_each_udev(udev, hpriv, i) { 293034d7c13SKuninori Morimoto if (usbhsh_udev_to_usbv(udev)) 294034d7c13SKuninori Morimoto continue; 295034d7c13SKuninori Morimoto goto usbhsh_device_find; 296034d7c13SKuninori Morimoto } 297034d7c13SKuninori Morimoto 298034d7c13SKuninori Morimoto dev_err(dev, "no free usbhsh_device\n"); 299034d7c13SKuninori Morimoto 300034d7c13SKuninori Morimoto return NULL; 301034d7c13SKuninori Morimoto 302034d7c13SKuninori Morimoto usbhsh_device_find: 303034d7c13SKuninori Morimoto if (usbhsh_device_has_endpoint(udev)) 304034d7c13SKuninori Morimoto dev_warn(dev, "udev have old endpoint\n"); 305034d7c13SKuninori Morimoto 306034d7c13SKuninori Morimoto /* uep will be attached */ 307034d7c13SKuninori Morimoto INIT_LIST_HEAD(&udev->ep_list_head); 308034d7c13SKuninori Morimoto 309034d7c13SKuninori Morimoto /* 310034d7c13SKuninori Morimoto * usbhsh_usbv_to_udev() 311034d7c13SKuninori Morimoto * usbhsh_udev_to_usbv() 312034d7c13SKuninori Morimoto * will be enable 313034d7c13SKuninori Morimoto */ 314034d7c13SKuninori Morimoto dev_set_drvdata(&usbv->dev, udev); 315034d7c13SKuninori Morimoto udev->usbv = usbv; 316034d7c13SKuninori Morimoto 317034d7c13SKuninori Morimoto /* set device config */ 318034d7c13SKuninori Morimoto usbhs_set_device_speed(priv, 319034d7c13SKuninori Morimoto usbhsh_device_number(hpriv, udev), 320034d7c13SKuninori Morimoto usbhsh_device_number(hpriv, udev), 321034d7c13SKuninori Morimoto 0, /* FIXME no parent */ 322034d7c13SKuninori Morimoto usbv->speed); 323034d7c13SKuninori Morimoto 324034d7c13SKuninori Morimoto dev_dbg(dev, "%s [%d](%p)\n", __func__, 325034d7c13SKuninori Morimoto usbhsh_device_number(hpriv, udev), udev); 326034d7c13SKuninori Morimoto 327034d7c13SKuninori Morimoto return udev; 328034d7c13SKuninori Morimoto } 329034d7c13SKuninori Morimoto 330034d7c13SKuninori Morimoto static void usbhsh_device_free(struct usbhsh_hpriv *hpriv, 331034d7c13SKuninori Morimoto struct usbhsh_device *udev) 332034d7c13SKuninori Morimoto { 333034d7c13SKuninori Morimoto struct usb_hcd *hcd = usbhsh_hpriv_to_hcd(hpriv); 334034d7c13SKuninori Morimoto struct device *dev = usbhsh_hcd_to_dev(hcd); 335034d7c13SKuninori Morimoto struct usb_device *usbv = usbhsh_udev_to_usbv(udev); 336034d7c13SKuninori Morimoto 337034d7c13SKuninori Morimoto dev_dbg(dev, "%s [%d](%p)\n", __func__, 338034d7c13SKuninori Morimoto usbhsh_device_number(hpriv, udev), udev); 339034d7c13SKuninori Morimoto 340034d7c13SKuninori Morimoto if (usbhsh_device_has_endpoint(udev)) 341034d7c13SKuninori Morimoto dev_warn(dev, "udev still have endpoint\n"); 342034d7c13SKuninori Morimoto 343034d7c13SKuninori Morimoto /* 344034d7c13SKuninori Morimoto * usbhsh_usbv_to_udev() 345034d7c13SKuninori Morimoto * usbhsh_udev_to_usbv() 346034d7c13SKuninori Morimoto * will be disable 347034d7c13SKuninori Morimoto */ 348034d7c13SKuninori Morimoto dev_set_drvdata(&usbv->dev, NULL); 349034d7c13SKuninori Morimoto udev->usbv = NULL; 350034d7c13SKuninori Morimoto } 351034d7c13SKuninori Morimoto 352034d7c13SKuninori Morimoto /* 353034d7c13SKuninori Morimoto * end-point control 354034d7c13SKuninori Morimoto */ 355034d7c13SKuninori Morimoto struct usbhsh_ep *usbhsh_endpoint_alloc(struct usbhsh_hpriv *hpriv, 356034d7c13SKuninori Morimoto struct usbhsh_device *udev, 357034d7c13SKuninori Morimoto struct usb_host_endpoint *ep, 358034d7c13SKuninori Morimoto gfp_t mem_flags) 359034d7c13SKuninori Morimoto { 360034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 361034d7c13SKuninori Morimoto struct usb_hcd *hcd = usbhsh_hpriv_to_hcd(hpriv); 362034d7c13SKuninori Morimoto struct usbhsh_ep *uep; 363034d7c13SKuninori Morimoto struct usbhsh_pipe_info *info; 364034d7c13SKuninori Morimoto struct usbhs_pipe *pipe, *best_pipe; 365034d7c13SKuninori Morimoto struct device *dev = usbhsh_hcd_to_dev(hcd); 366034d7c13SKuninori Morimoto struct usb_endpoint_descriptor *desc = &ep->desc; 367034d7c13SKuninori Morimoto int type, i; 368034d7c13SKuninori Morimoto unsigned int min_usr; 369034d7c13SKuninori Morimoto 370034d7c13SKuninori Morimoto uep = kzalloc(sizeof(struct usbhsh_ep), mem_flags); 371034d7c13SKuninori Morimoto if (!uep) { 372034d7c13SKuninori Morimoto dev_err(dev, "usbhsh_ep alloc fail\n"); 373034d7c13SKuninori Morimoto return NULL; 374034d7c13SKuninori Morimoto } 375034d7c13SKuninori Morimoto type = usb_endpoint_type(desc); 376034d7c13SKuninori Morimoto 377034d7c13SKuninori Morimoto /* 378034d7c13SKuninori Morimoto * find best pipe for endpoint 379034d7c13SKuninori Morimoto * see 380034d7c13SKuninori Morimoto * HARDWARE LIMITATION 381034d7c13SKuninori Morimoto */ 382034d7c13SKuninori Morimoto min_usr = ~0; 383034d7c13SKuninori Morimoto best_pipe = NULL; 384034d7c13SKuninori Morimoto usbhs_for_each_pipe_with_dcp(pipe, priv, i) { 385034d7c13SKuninori Morimoto if (!usbhs_pipe_type_is(pipe, type)) 386034d7c13SKuninori Morimoto continue; 387034d7c13SKuninori Morimoto 388034d7c13SKuninori Morimoto info = usbhsh_pipe_info(pipe); 389034d7c13SKuninori Morimoto 390034d7c13SKuninori Morimoto if (min_usr > info->usr_cnt) { 391034d7c13SKuninori Morimoto min_usr = info->usr_cnt; 392034d7c13SKuninori Morimoto best_pipe = pipe; 393034d7c13SKuninori Morimoto } 394034d7c13SKuninori Morimoto } 395034d7c13SKuninori Morimoto 396034d7c13SKuninori Morimoto if (unlikely(!best_pipe)) { 397034d7c13SKuninori Morimoto dev_err(dev, "couldn't find best pipe\n"); 398034d7c13SKuninori Morimoto kfree(uep); 399034d7c13SKuninori Morimoto return NULL; 400034d7c13SKuninori Morimoto } 401034d7c13SKuninori Morimoto 402034d7c13SKuninori Morimoto /* 403034d7c13SKuninori Morimoto * init uep 404034d7c13SKuninori Morimoto */ 405034d7c13SKuninori Morimoto uep->pipe = best_pipe; 406034d7c13SKuninori Morimoto uep->maxp = usb_endpoint_maxp(desc); 407034d7c13SKuninori Morimoto usbhsh_uep_to_udev(uep) = udev; 408034d7c13SKuninori Morimoto usbhsh_ep_to_uep(ep) = uep; 409034d7c13SKuninori Morimoto 410034d7c13SKuninori Morimoto /* 411034d7c13SKuninori Morimoto * update pipe user count 412034d7c13SKuninori Morimoto */ 413034d7c13SKuninori Morimoto info = usbhsh_pipe_info(best_pipe); 414034d7c13SKuninori Morimoto info->usr_cnt++; 415034d7c13SKuninori Morimoto 416034d7c13SKuninori Morimoto /* init this endpoint, and attach it to udev */ 417034d7c13SKuninori Morimoto INIT_LIST_HEAD(&uep->ep_list); 418034d7c13SKuninori Morimoto list_add_tail(&uep->ep_list, &udev->ep_list_head); 419034d7c13SKuninori Morimoto 420034d7c13SKuninori Morimoto /* 421034d7c13SKuninori Morimoto * usbhs_pipe_config_update() should be called after 422034d7c13SKuninori Morimoto * usbhs_device_config() 423034d7c13SKuninori Morimoto * see 424034d7c13SKuninori Morimoto * DCPMAXP/PIPEMAXP 425034d7c13SKuninori Morimoto */ 426034d7c13SKuninori Morimoto usbhs_pipe_config_update(uep->pipe, 427034d7c13SKuninori Morimoto usbhsh_device_number(hpriv, udev), 428034d7c13SKuninori Morimoto usb_endpoint_num(desc), 429034d7c13SKuninori Morimoto uep->maxp); 430034d7c13SKuninori Morimoto 431034d7c13SKuninori Morimoto dev_dbg(dev, "%s [%d-%s](%p)\n", __func__, 432034d7c13SKuninori Morimoto usbhsh_device_number(hpriv, udev), 433034d7c13SKuninori Morimoto usbhs_pipe_name(pipe), uep); 434034d7c13SKuninori Morimoto 435034d7c13SKuninori Morimoto return uep; 436034d7c13SKuninori Morimoto } 437034d7c13SKuninori Morimoto 438034d7c13SKuninori Morimoto void usbhsh_endpoint_free(struct usbhsh_hpriv *hpriv, 439034d7c13SKuninori Morimoto struct usb_host_endpoint *ep) 440034d7c13SKuninori Morimoto { 441034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 442034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 443034d7c13SKuninori Morimoto struct usbhsh_ep *uep = usbhsh_ep_to_uep(ep); 444034d7c13SKuninori Morimoto struct usbhsh_pipe_info *info; 445034d7c13SKuninori Morimoto 446034d7c13SKuninori Morimoto if (!uep) 447034d7c13SKuninori Morimoto return; 448034d7c13SKuninori Morimoto 449034d7c13SKuninori Morimoto dev_dbg(dev, "%s [%d-%s](%p)\n", __func__, 45055b5a624SKuninori Morimoto usbhsh_device_number(hpriv, usbhsh_uep_to_udev(uep)), 451034d7c13SKuninori Morimoto usbhs_pipe_name(uep->pipe), uep); 452034d7c13SKuninori Morimoto 453034d7c13SKuninori Morimoto info = usbhsh_pipe_info(uep->pipe); 454034d7c13SKuninori Morimoto info->usr_cnt--; 455034d7c13SKuninori Morimoto 456034d7c13SKuninori Morimoto /* remove this endpoint from udev */ 457034d7c13SKuninori Morimoto list_del_init(&uep->ep_list); 458034d7c13SKuninori Morimoto 459034d7c13SKuninori Morimoto usbhsh_uep_to_udev(uep) = NULL; 460034d7c13SKuninori Morimoto usbhsh_ep_to_uep(ep) = NULL; 461034d7c13SKuninori Morimoto 462034d7c13SKuninori Morimoto kfree(uep); 463034d7c13SKuninori Morimoto } 464034d7c13SKuninori Morimoto 465034d7c13SKuninori Morimoto /* 466034d7c13SKuninori Morimoto * queue push/pop 467034d7c13SKuninori Morimoto */ 468034d7c13SKuninori Morimoto static void usbhsh_queue_done(struct usbhs_priv *priv, struct usbhs_pkt *pkt) 469034d7c13SKuninori Morimoto { 470034d7c13SKuninori Morimoto struct usbhsh_request *ureq = usbhsh_pkt_to_req(pkt); 471034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 472034d7c13SKuninori Morimoto struct usb_hcd *hcd = usbhsh_hpriv_to_hcd(hpriv); 473034d7c13SKuninori Morimoto struct urb *urb = ureq->urb; 474034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 475034d7c13SKuninori Morimoto 476034d7c13SKuninori Morimoto dev_dbg(dev, "%s\n", __func__); 477034d7c13SKuninori Morimoto 478034d7c13SKuninori Morimoto if (!urb) { 479034d7c13SKuninori Morimoto dev_warn(dev, "pkt doesn't have urb\n"); 480034d7c13SKuninori Morimoto return; 481034d7c13SKuninori Morimoto } 482034d7c13SKuninori Morimoto 483034d7c13SKuninori Morimoto urb->actual_length = pkt->actual; 484034d7c13SKuninori Morimoto usbhsh_req_free(hpriv, ureq); 485034d7c13SKuninori Morimoto usbhsh_urb_to_ureq(urb) = NULL; 486034d7c13SKuninori Morimoto 487034d7c13SKuninori Morimoto usb_hcd_unlink_urb_from_ep(hcd, urb); 488034d7c13SKuninori Morimoto usb_hcd_giveback_urb(hcd, urb, 0); 489034d7c13SKuninori Morimoto } 490034d7c13SKuninori Morimoto 491034d7c13SKuninori Morimoto static int usbhsh_queue_push(struct usb_hcd *hcd, 492034d7c13SKuninori Morimoto struct usbhs_pipe *pipe, 493034d7c13SKuninori Morimoto struct urb *urb) 494034d7c13SKuninori Morimoto { 495034d7c13SKuninori Morimoto struct usbhsh_request *ureq = usbhsh_urb_to_ureq(urb); 496034d7c13SKuninori Morimoto struct usbhs_pkt *pkt = &ureq->pkt; 497034d7c13SKuninori Morimoto struct device *dev = usbhsh_hcd_to_dev(hcd); 498034d7c13SKuninori Morimoto void *buf; 499034d7c13SKuninori Morimoto int len; 500034d7c13SKuninori Morimoto 501034d7c13SKuninori Morimoto if (usb_pipeisoc(urb->pipe)) { 502034d7c13SKuninori Morimoto dev_err(dev, "pipe iso is not supported now\n"); 503034d7c13SKuninori Morimoto return -EIO; 504034d7c13SKuninori Morimoto } 505034d7c13SKuninori Morimoto 506034d7c13SKuninori Morimoto if (usb_pipein(urb->pipe)) 507034d7c13SKuninori Morimoto pipe->handler = &usbhs_fifo_pio_pop_handler; 508034d7c13SKuninori Morimoto else 509034d7c13SKuninori Morimoto pipe->handler = &usbhs_fifo_pio_push_handler; 510034d7c13SKuninori Morimoto 511034d7c13SKuninori Morimoto buf = (void *)(urb->transfer_buffer + urb->actual_length); 512034d7c13SKuninori Morimoto len = urb->transfer_buffer_length - urb->actual_length; 513034d7c13SKuninori Morimoto 514034d7c13SKuninori Morimoto dev_dbg(dev, "%s\n", __func__); 515034d7c13SKuninori Morimoto usbhs_pkt_push(pipe, pkt, usbhsh_queue_done, 516034d7c13SKuninori Morimoto buf, len, (urb->transfer_flags & URB_ZERO_PACKET)); 517034d7c13SKuninori Morimoto usbhs_pkt_start(pipe); 518034d7c13SKuninori Morimoto 519034d7c13SKuninori Morimoto return 0; 520034d7c13SKuninori Morimoto } 521034d7c13SKuninori Morimoto 522034d7c13SKuninori Morimoto /* 523034d7c13SKuninori Morimoto * DCP setup stage 524034d7c13SKuninori Morimoto */ 525034d7c13SKuninori Morimoto static int usbhsh_is_request_address(struct urb *urb) 526034d7c13SKuninori Morimoto { 527034d7c13SKuninori Morimoto struct usb_ctrlrequest *cmd; 528034d7c13SKuninori Morimoto 529034d7c13SKuninori Morimoto cmd = (struct usb_ctrlrequest *)urb->setup_packet; 530034d7c13SKuninori Morimoto 531034d7c13SKuninori Morimoto if ((DeviceOutRequest == cmd->bRequestType << 8) && 532034d7c13SKuninori Morimoto (USB_REQ_SET_ADDRESS == cmd->bRequest)) 533034d7c13SKuninori Morimoto return 1; 534034d7c13SKuninori Morimoto else 535034d7c13SKuninori Morimoto return 0; 536034d7c13SKuninori Morimoto } 537034d7c13SKuninori Morimoto 538034d7c13SKuninori Morimoto static void usbhsh_setup_stage_packet_push(struct usbhsh_hpriv *hpriv, 539034d7c13SKuninori Morimoto struct urb *urb, 540034d7c13SKuninori Morimoto struct usbhs_pipe *pipe) 541034d7c13SKuninori Morimoto { 542034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 543034d7c13SKuninori Morimoto struct usb_ctrlrequest req; 544034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 545034d7c13SKuninori Morimoto 546034d7c13SKuninori Morimoto /* 547034d7c13SKuninori Morimoto * wait setup packet ACK 548034d7c13SKuninori Morimoto * see 549034d7c13SKuninori Morimoto * usbhsh_irq_setup_ack() 550034d7c13SKuninori Morimoto * usbhsh_irq_setup_err() 551034d7c13SKuninori Morimoto */ 552034d7c13SKuninori Morimoto DECLARE_COMPLETION(done); 553034d7c13SKuninori Morimoto hpriv->done = &done; 554034d7c13SKuninori Morimoto 555034d7c13SKuninori Morimoto /* copy original request */ 556034d7c13SKuninori Morimoto memcpy(&req, urb->setup_packet, sizeof(struct usb_ctrlrequest)); 557034d7c13SKuninori Morimoto 558034d7c13SKuninori Morimoto /* 559034d7c13SKuninori Morimoto * renesas_usbhs can not use original usb address. 560034d7c13SKuninori Morimoto * see HARDWARE LIMITATION. 561034d7c13SKuninori Morimoto * modify usb address here. 562034d7c13SKuninori Morimoto */ 563034d7c13SKuninori Morimoto if (usbhsh_is_request_address(urb)) { 564034d7c13SKuninori Morimoto /* FIXME */ 565034d7c13SKuninori Morimoto req.wValue = 1; 566034d7c13SKuninori Morimoto dev_dbg(dev, "create new address - %d\n", req.wValue); 567034d7c13SKuninori Morimoto } 568034d7c13SKuninori Morimoto 569034d7c13SKuninori Morimoto /* set request */ 570034d7c13SKuninori Morimoto usbhs_usbreq_set_val(priv, &req); 571034d7c13SKuninori Morimoto 572034d7c13SKuninori Morimoto /* 573034d7c13SKuninori Morimoto * wait setup packet ACK 574034d7c13SKuninori Morimoto */ 575034d7c13SKuninori Morimoto wait_for_completion(&done); 576034d7c13SKuninori Morimoto hpriv->done = NULL; 577034d7c13SKuninori Morimoto 578034d7c13SKuninori Morimoto dev_dbg(dev, "%s done\n", __func__); 579034d7c13SKuninori Morimoto } 580034d7c13SKuninori Morimoto 581034d7c13SKuninori Morimoto /* 582034d7c13SKuninori Morimoto * DCP data stage 583034d7c13SKuninori Morimoto */ 584034d7c13SKuninori Morimoto static void usbhsh_data_stage_packet_done(struct usbhs_priv *priv, 585034d7c13SKuninori Morimoto struct usbhs_pkt *pkt) 586034d7c13SKuninori Morimoto { 587034d7c13SKuninori Morimoto struct usbhsh_request *ureq = usbhsh_pkt_to_req(pkt); 588034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 589034d7c13SKuninori Morimoto struct urb *urb = ureq->urb; 590034d7c13SKuninori Morimoto 591034d7c13SKuninori Morimoto /* this ureq was connected to urb when usbhsh_urb_enqueue() */ 592034d7c13SKuninori Morimoto 593034d7c13SKuninori Morimoto usbhsh_req_free(hpriv, ureq); 594034d7c13SKuninori Morimoto usbhsh_urb_to_ureq(urb) = NULL; 595034d7c13SKuninori Morimoto } 596034d7c13SKuninori Morimoto 597034d7c13SKuninori Morimoto static void usbhsh_data_stage_packet_push(struct usbhsh_hpriv *hpriv, 598034d7c13SKuninori Morimoto struct urb *urb, 599034d7c13SKuninori Morimoto struct usbhs_pipe *pipe) 600034d7c13SKuninori Morimoto { 601034d7c13SKuninori Morimoto struct usbhsh_request *ureq; 602034d7c13SKuninori Morimoto struct usbhs_pkt *pkt; 603034d7c13SKuninori Morimoto 604034d7c13SKuninori Morimoto /* 605034d7c13SKuninori Morimoto * FIXME 606034d7c13SKuninori Morimoto * 607034d7c13SKuninori Morimoto * data stage uses ureq which is connected to urb 608034d7c13SKuninori Morimoto * see usbhsh_urb_enqueue() :: alloc new request. 609034d7c13SKuninori Morimoto * it will be freed in usbhsh_data_stage_packet_done() 610034d7c13SKuninori Morimoto */ 611034d7c13SKuninori Morimoto ureq = usbhsh_urb_to_ureq(urb); 612034d7c13SKuninori Morimoto pkt = &ureq->pkt; 613034d7c13SKuninori Morimoto 614034d7c13SKuninori Morimoto if (usb_pipein(urb->pipe)) 615034d7c13SKuninori Morimoto pipe->handler = &usbhs_dcp_data_stage_in_handler; 616034d7c13SKuninori Morimoto else 617034d7c13SKuninori Morimoto pipe->handler = &usbhs_dcp_data_stage_out_handler; 618034d7c13SKuninori Morimoto 619034d7c13SKuninori Morimoto usbhs_pkt_push(pipe, pkt, 620034d7c13SKuninori Morimoto usbhsh_data_stage_packet_done, 621034d7c13SKuninori Morimoto urb->transfer_buffer, 622034d7c13SKuninori Morimoto urb->transfer_buffer_length, 623034d7c13SKuninori Morimoto (urb->transfer_flags & URB_ZERO_PACKET)); 624034d7c13SKuninori Morimoto } 625034d7c13SKuninori Morimoto 626034d7c13SKuninori Morimoto /* 627034d7c13SKuninori Morimoto * DCP status stage 628034d7c13SKuninori Morimoto */ 629034d7c13SKuninori Morimoto static void usbhsh_status_stage_packet_push(struct usbhsh_hpriv *hpriv, 630034d7c13SKuninori Morimoto struct urb *urb, 631034d7c13SKuninori Morimoto struct usbhs_pipe *pipe) 632034d7c13SKuninori Morimoto { 633034d7c13SKuninori Morimoto struct usbhsh_request *ureq; 634034d7c13SKuninori Morimoto struct usbhs_pkt *pkt; 635034d7c13SKuninori Morimoto 636034d7c13SKuninori Morimoto /* 637034d7c13SKuninori Morimoto * FIXME 638034d7c13SKuninori Morimoto * 639034d7c13SKuninori Morimoto * status stage uses allocated ureq. 640034d7c13SKuninori Morimoto * it will be freed on usbhsh_queue_done() 641034d7c13SKuninori Morimoto */ 642034d7c13SKuninori Morimoto ureq = usbhsh_req_alloc(hpriv, urb, GFP_KERNEL); 643034d7c13SKuninori Morimoto pkt = &ureq->pkt; 644034d7c13SKuninori Morimoto 645034d7c13SKuninori Morimoto if (usb_pipein(urb->pipe)) 646034d7c13SKuninori Morimoto pipe->handler = &usbhs_dcp_status_stage_in_handler; 647034d7c13SKuninori Morimoto else 648034d7c13SKuninori Morimoto pipe->handler = &usbhs_dcp_status_stage_out_handler; 649034d7c13SKuninori Morimoto 650034d7c13SKuninori Morimoto usbhs_pkt_push(pipe, pkt, 651034d7c13SKuninori Morimoto usbhsh_queue_done, 652034d7c13SKuninori Morimoto NULL, 653034d7c13SKuninori Morimoto urb->transfer_buffer_length, 654034d7c13SKuninori Morimoto 0); 655034d7c13SKuninori Morimoto } 656034d7c13SKuninori Morimoto 657034d7c13SKuninori Morimoto static int usbhsh_dcp_queue_push(struct usb_hcd *hcd, 658034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv, 659034d7c13SKuninori Morimoto struct usbhs_pipe *pipe, 660034d7c13SKuninori Morimoto struct urb *urb) 661034d7c13SKuninori Morimoto { 662034d7c13SKuninori Morimoto struct device *dev = usbhsh_hcd_to_dev(hcd); 663034d7c13SKuninori Morimoto 664034d7c13SKuninori Morimoto dev_dbg(dev, "%s\n", __func__); 665034d7c13SKuninori Morimoto 666034d7c13SKuninori Morimoto /* 667034d7c13SKuninori Morimoto * setup stage 668034d7c13SKuninori Morimoto * 669034d7c13SKuninori Morimoto * usbhsh_send_setup_stage_packet() wait SACK/SIGN 670034d7c13SKuninori Morimoto */ 671034d7c13SKuninori Morimoto usbhsh_setup_stage_packet_push(hpriv, urb, pipe); 672034d7c13SKuninori Morimoto 673034d7c13SKuninori Morimoto /* 674034d7c13SKuninori Morimoto * data stage 675034d7c13SKuninori Morimoto * 676034d7c13SKuninori Morimoto * It is pushed only when urb has buffer. 677034d7c13SKuninori Morimoto */ 678034d7c13SKuninori Morimoto if (urb->transfer_buffer_length) 679034d7c13SKuninori Morimoto usbhsh_data_stage_packet_push(hpriv, urb, pipe); 680034d7c13SKuninori Morimoto 681034d7c13SKuninori Morimoto /* 682034d7c13SKuninori Morimoto * status stage 683034d7c13SKuninori Morimoto */ 684034d7c13SKuninori Morimoto usbhsh_status_stage_packet_push(hpriv, urb, pipe); 685034d7c13SKuninori Morimoto 686034d7c13SKuninori Morimoto /* 687034d7c13SKuninori Morimoto * start pushed packets 688034d7c13SKuninori Morimoto */ 689034d7c13SKuninori Morimoto usbhs_pkt_start(pipe); 690034d7c13SKuninori Morimoto 691034d7c13SKuninori Morimoto return 0; 692034d7c13SKuninori Morimoto } 693034d7c13SKuninori Morimoto 694034d7c13SKuninori Morimoto /* 695034d7c13SKuninori Morimoto * dma map functions 696034d7c13SKuninori Morimoto */ 697034d7c13SKuninori Morimoto static int usbhsh_dma_map_ctrl(struct usbhs_pkt *pkt, int map) 698034d7c13SKuninori Morimoto { 699034d7c13SKuninori Morimoto return 0; 700034d7c13SKuninori Morimoto } 701034d7c13SKuninori Morimoto 702034d7c13SKuninori Morimoto /* 703034d7c13SKuninori Morimoto * for hc_driver 704034d7c13SKuninori Morimoto */ 705034d7c13SKuninori Morimoto static int usbhsh_host_start(struct usb_hcd *hcd) 706034d7c13SKuninori Morimoto { 707034d7c13SKuninori Morimoto return 0; 708034d7c13SKuninori Morimoto } 709034d7c13SKuninori Morimoto 710034d7c13SKuninori Morimoto static void usbhsh_host_stop(struct usb_hcd *hcd) 711034d7c13SKuninori Morimoto { 712034d7c13SKuninori Morimoto } 713034d7c13SKuninori Morimoto 714034d7c13SKuninori Morimoto static int usbhsh_urb_enqueue(struct usb_hcd *hcd, 715034d7c13SKuninori Morimoto struct urb *urb, 716034d7c13SKuninori Morimoto gfp_t mem_flags) 717034d7c13SKuninori Morimoto { 718034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_hcd_to_hpriv(hcd); 719034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 720034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 721034d7c13SKuninori Morimoto struct usb_device *usbv = usbhsh_urb_to_usbv(urb); 722034d7c13SKuninori Morimoto struct usb_host_endpoint *ep = urb->ep; 723034d7c13SKuninori Morimoto struct usbhsh_request *ureq; 724034d7c13SKuninori Morimoto struct usbhsh_device *udev, *new_udev = NULL; 725034d7c13SKuninori Morimoto struct usbhs_pipe *pipe; 726034d7c13SKuninori Morimoto struct usbhsh_ep *uep; 727034d7c13SKuninori Morimoto 728034d7c13SKuninori Morimoto int ret; 729034d7c13SKuninori Morimoto 730034d7c13SKuninori Morimoto dev_dbg(dev, "%s (%s)\n", 731034d7c13SKuninori Morimoto __func__, usb_pipein(urb->pipe) ? "in" : "out"); 732034d7c13SKuninori Morimoto 733034d7c13SKuninori Morimoto ret = usb_hcd_link_urb_to_ep(hcd, urb); 734034d7c13SKuninori Morimoto if (ret) 735034d7c13SKuninori Morimoto goto usbhsh_urb_enqueue_error_not_linked; 736034d7c13SKuninori Morimoto 737034d7c13SKuninori Morimoto /* 738034d7c13SKuninori Morimoto * get udev 739034d7c13SKuninori Morimoto */ 740034d7c13SKuninori Morimoto udev = usbhsh_usbv_to_udev(usbv); 741034d7c13SKuninori Morimoto if (!udev) { 742034d7c13SKuninori Morimoto new_udev = usbhsh_device_alloc(hpriv, urb); 743034d7c13SKuninori Morimoto if (!new_udev) 744034d7c13SKuninori Morimoto goto usbhsh_urb_enqueue_error_not_linked; 745034d7c13SKuninori Morimoto 746034d7c13SKuninori Morimoto udev = new_udev; 747034d7c13SKuninori Morimoto } 748034d7c13SKuninori Morimoto 749034d7c13SKuninori Morimoto /* 750034d7c13SKuninori Morimoto * get uep 751034d7c13SKuninori Morimoto */ 752034d7c13SKuninori Morimoto uep = usbhsh_ep_to_uep(ep); 753034d7c13SKuninori Morimoto if (!uep) { 754034d7c13SKuninori Morimoto uep = usbhsh_endpoint_alloc(hpriv, udev, ep, mem_flags); 755034d7c13SKuninori Morimoto if (!uep) 756034d7c13SKuninori Morimoto goto usbhsh_urb_enqueue_error_free_device; 757034d7c13SKuninori Morimoto } 758034d7c13SKuninori Morimoto pipe = usbhsh_uep_to_pipe(uep); 759034d7c13SKuninori Morimoto 760034d7c13SKuninori Morimoto /* 761034d7c13SKuninori Morimoto * alloc new request 762034d7c13SKuninori Morimoto */ 763034d7c13SKuninori Morimoto ureq = usbhsh_req_alloc(hpriv, urb, mem_flags); 764034d7c13SKuninori Morimoto if (unlikely(!ureq)) { 765034d7c13SKuninori Morimoto ret = -ENOMEM; 766034d7c13SKuninori Morimoto goto usbhsh_urb_enqueue_error_free_endpoint; 767034d7c13SKuninori Morimoto } 768034d7c13SKuninori Morimoto usbhsh_urb_to_ureq(urb) = ureq; 769034d7c13SKuninori Morimoto 770034d7c13SKuninori Morimoto /* 771034d7c13SKuninori Morimoto * push packet 772034d7c13SKuninori Morimoto */ 773034d7c13SKuninori Morimoto if (usb_pipecontrol(urb->pipe)) 774034d7c13SKuninori Morimoto usbhsh_dcp_queue_push(hcd, hpriv, pipe, urb); 775034d7c13SKuninori Morimoto else 776034d7c13SKuninori Morimoto usbhsh_queue_push(hcd, pipe, urb); 777034d7c13SKuninori Morimoto 778034d7c13SKuninori Morimoto return 0; 779034d7c13SKuninori Morimoto 780034d7c13SKuninori Morimoto usbhsh_urb_enqueue_error_free_endpoint: 781034d7c13SKuninori Morimoto usbhsh_endpoint_free(hpriv, ep); 782034d7c13SKuninori Morimoto usbhsh_urb_enqueue_error_free_device: 783034d7c13SKuninori Morimoto if (new_udev) 784034d7c13SKuninori Morimoto usbhsh_device_free(hpriv, new_udev); 785034d7c13SKuninori Morimoto usbhsh_urb_enqueue_error_not_linked: 786034d7c13SKuninori Morimoto 787034d7c13SKuninori Morimoto dev_dbg(dev, "%s error\n", __func__); 788034d7c13SKuninori Morimoto 789034d7c13SKuninori Morimoto return ret; 790034d7c13SKuninori Morimoto } 791034d7c13SKuninori Morimoto 792034d7c13SKuninori Morimoto static int usbhsh_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) 793034d7c13SKuninori Morimoto { 794034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_hcd_to_hpriv(hcd); 795034d7c13SKuninori Morimoto struct usbhsh_request *ureq = usbhsh_urb_to_ureq(urb); 796034d7c13SKuninori Morimoto 797034d7c13SKuninori Morimoto if (ureq) { 798034d7c13SKuninori Morimoto usbhsh_req_free(hpriv, ureq); 799034d7c13SKuninori Morimoto usbhsh_urb_to_ureq(urb) = NULL; 800034d7c13SKuninori Morimoto } 801034d7c13SKuninori Morimoto 802034d7c13SKuninori Morimoto return 0; 803034d7c13SKuninori Morimoto } 804034d7c13SKuninori Morimoto 805034d7c13SKuninori Morimoto static void usbhsh_endpoint_disable(struct usb_hcd *hcd, 806034d7c13SKuninori Morimoto struct usb_host_endpoint *ep) 807034d7c13SKuninori Morimoto { 808034d7c13SKuninori Morimoto struct usbhsh_ep *uep = usbhsh_ep_to_uep(ep); 809034d7c13SKuninori Morimoto struct usbhsh_device *udev; 810034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv; 811034d7c13SKuninori Morimoto 812034d7c13SKuninori Morimoto /* 813034d7c13SKuninori Morimoto * this function might be called manytimes by same hcd/ep 814034d7c13SKuninori Morimoto * in-endpoitn == out-endpoint if ep == dcp. 815034d7c13SKuninori Morimoto */ 816034d7c13SKuninori Morimoto if (!uep) 817034d7c13SKuninori Morimoto return; 818034d7c13SKuninori Morimoto 819034d7c13SKuninori Morimoto udev = usbhsh_uep_to_udev(uep); 820034d7c13SKuninori Morimoto hpriv = usbhsh_hcd_to_hpriv(hcd); 821034d7c13SKuninori Morimoto 822034d7c13SKuninori Morimoto usbhsh_endpoint_free(hpriv, ep); 823034d7c13SKuninori Morimoto ep->hcpriv = NULL; 824034d7c13SKuninori Morimoto 825034d7c13SKuninori Morimoto /* 826034d7c13SKuninori Morimoto * if there is no endpoint, 827034d7c13SKuninori Morimoto * free device 828034d7c13SKuninori Morimoto */ 829034d7c13SKuninori Morimoto if (!usbhsh_device_has_endpoint(udev)) 830034d7c13SKuninori Morimoto usbhsh_device_free(hpriv, udev); 831034d7c13SKuninori Morimoto } 832034d7c13SKuninori Morimoto 833034d7c13SKuninori Morimoto static int usbhsh_hub_status_data(struct usb_hcd *hcd, char *buf) 834034d7c13SKuninori Morimoto { 835034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_hcd_to_hpriv(hcd); 836034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 837034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 838034d7c13SKuninori Morimoto int roothub_id = 1; /* only 1 root hub */ 839034d7c13SKuninori Morimoto 840034d7c13SKuninori Morimoto /* 841034d7c13SKuninori Morimoto * does port stat was changed ? 842034d7c13SKuninori Morimoto * check USB_PORT_STAT_C_xxx << 16 843034d7c13SKuninori Morimoto */ 844034d7c13SKuninori Morimoto if (usbhsh_port_stat_get(hpriv) & 0xFFFF0000) 845034d7c13SKuninori Morimoto *buf = (1 << roothub_id); 846034d7c13SKuninori Morimoto else 847034d7c13SKuninori Morimoto *buf = 0; 848034d7c13SKuninori Morimoto 849034d7c13SKuninori Morimoto dev_dbg(dev, "%s (%02x)\n", __func__, *buf); 850034d7c13SKuninori Morimoto 851034d7c13SKuninori Morimoto return !!(*buf); 852034d7c13SKuninori Morimoto } 853034d7c13SKuninori Morimoto 854034d7c13SKuninori Morimoto static int __usbhsh_hub_hub_feature(struct usbhsh_hpriv *hpriv, 855034d7c13SKuninori Morimoto u16 typeReq, u16 wValue, 856034d7c13SKuninori Morimoto u16 wIndex, char *buf, u16 wLength) 857034d7c13SKuninori Morimoto { 858034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 859034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 860034d7c13SKuninori Morimoto 861034d7c13SKuninori Morimoto switch (wValue) { 862034d7c13SKuninori Morimoto case C_HUB_OVER_CURRENT: 863034d7c13SKuninori Morimoto case C_HUB_LOCAL_POWER: 864034d7c13SKuninori Morimoto dev_dbg(dev, "%s :: C_HUB_xx\n", __func__); 865034d7c13SKuninori Morimoto return 0; 866034d7c13SKuninori Morimoto } 867034d7c13SKuninori Morimoto 868034d7c13SKuninori Morimoto return -EPIPE; 869034d7c13SKuninori Morimoto } 870034d7c13SKuninori Morimoto 871034d7c13SKuninori Morimoto static int __usbhsh_hub_port_feature(struct usbhsh_hpriv *hpriv, 872034d7c13SKuninori Morimoto u16 typeReq, u16 wValue, 873034d7c13SKuninori Morimoto u16 wIndex, char *buf, u16 wLength) 874034d7c13SKuninori Morimoto { 875034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 876034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 877034d7c13SKuninori Morimoto int enable = (typeReq == SetPortFeature); 878034d7c13SKuninori Morimoto int speed, i, timeout = 128; 879034d7c13SKuninori Morimoto int roothub_id = 1; /* only 1 root hub */ 880034d7c13SKuninori Morimoto 881034d7c13SKuninori Morimoto /* common error */ 882034d7c13SKuninori Morimoto if (wIndex > roothub_id || wLength != 0) 883034d7c13SKuninori Morimoto return -EPIPE; 884034d7c13SKuninori Morimoto 885034d7c13SKuninori Morimoto /* check wValue */ 886034d7c13SKuninori Morimoto switch (wValue) { 887034d7c13SKuninori Morimoto case USB_PORT_FEAT_POWER: 888034d7c13SKuninori Morimoto usbhs_vbus_ctrl(priv, enable); 889034d7c13SKuninori Morimoto dev_dbg(dev, "%s :: USB_PORT_FEAT_POWER\n", __func__); 890034d7c13SKuninori Morimoto break; 891034d7c13SKuninori Morimoto 892034d7c13SKuninori Morimoto case USB_PORT_FEAT_ENABLE: 893034d7c13SKuninori Morimoto case USB_PORT_FEAT_SUSPEND: 894034d7c13SKuninori Morimoto case USB_PORT_FEAT_C_ENABLE: 895034d7c13SKuninori Morimoto case USB_PORT_FEAT_C_SUSPEND: 896034d7c13SKuninori Morimoto case USB_PORT_FEAT_C_CONNECTION: 897034d7c13SKuninori Morimoto case USB_PORT_FEAT_C_OVER_CURRENT: 898034d7c13SKuninori Morimoto case USB_PORT_FEAT_C_RESET: 899034d7c13SKuninori Morimoto dev_dbg(dev, "%s :: USB_PORT_FEAT_xxx\n", __func__); 900034d7c13SKuninori Morimoto break; 901034d7c13SKuninori Morimoto 902034d7c13SKuninori Morimoto case USB_PORT_FEAT_RESET: 903034d7c13SKuninori Morimoto if (!enable) 904034d7c13SKuninori Morimoto break; 905034d7c13SKuninori Morimoto 906034d7c13SKuninori Morimoto usbhsh_port_stat_clear(hpriv, 907034d7c13SKuninori Morimoto USB_PORT_STAT_HIGH_SPEED | 908034d7c13SKuninori Morimoto USB_PORT_STAT_LOW_SPEED); 909034d7c13SKuninori Morimoto 910034d7c13SKuninori Morimoto usbhs_bus_send_reset(priv); 911034d7c13SKuninori Morimoto msleep(20); 912034d7c13SKuninori Morimoto usbhs_bus_send_sof_enable(priv); 913034d7c13SKuninori Morimoto 914034d7c13SKuninori Morimoto for (i = 0; i < timeout ; i++) { 915034d7c13SKuninori Morimoto switch (usbhs_bus_get_speed(priv)) { 916034d7c13SKuninori Morimoto case USB_SPEED_LOW: 917034d7c13SKuninori Morimoto speed = USB_PORT_STAT_LOW_SPEED; 918034d7c13SKuninori Morimoto goto got_usb_bus_speed; 919034d7c13SKuninori Morimoto case USB_SPEED_HIGH: 920034d7c13SKuninori Morimoto speed = USB_PORT_STAT_HIGH_SPEED; 921034d7c13SKuninori Morimoto goto got_usb_bus_speed; 922034d7c13SKuninori Morimoto case USB_SPEED_FULL: 923034d7c13SKuninori Morimoto speed = 0; 924034d7c13SKuninori Morimoto goto got_usb_bus_speed; 925034d7c13SKuninori Morimoto } 926034d7c13SKuninori Morimoto 927034d7c13SKuninori Morimoto msleep(20); 928034d7c13SKuninori Morimoto } 929034d7c13SKuninori Morimoto return -EPIPE; 930034d7c13SKuninori Morimoto 931034d7c13SKuninori Morimoto got_usb_bus_speed: 932034d7c13SKuninori Morimoto usbhsh_port_stat_set(hpriv, speed); 933034d7c13SKuninori Morimoto usbhsh_port_stat_set(hpriv, USB_PORT_STAT_ENABLE); 934034d7c13SKuninori Morimoto 935034d7c13SKuninori Morimoto dev_dbg(dev, "%s :: USB_PORT_FEAT_RESET (speed = %d)\n", 936034d7c13SKuninori Morimoto __func__, speed); 937034d7c13SKuninori Morimoto 938034d7c13SKuninori Morimoto /* status change is not needed */ 939034d7c13SKuninori Morimoto return 0; 940034d7c13SKuninori Morimoto 941034d7c13SKuninori Morimoto default: 942034d7c13SKuninori Morimoto return -EPIPE; 943034d7c13SKuninori Morimoto } 944034d7c13SKuninori Morimoto 945034d7c13SKuninori Morimoto /* set/clear status */ 946034d7c13SKuninori Morimoto if (enable) 947034d7c13SKuninori Morimoto usbhsh_port_stat_set(hpriv, (1 << wValue)); 948034d7c13SKuninori Morimoto else 949034d7c13SKuninori Morimoto usbhsh_port_stat_clear(hpriv, (1 << wValue)); 950034d7c13SKuninori Morimoto 951034d7c13SKuninori Morimoto return 0; 952034d7c13SKuninori Morimoto } 953034d7c13SKuninori Morimoto 954034d7c13SKuninori Morimoto static int __usbhsh_hub_get_status(struct usbhsh_hpriv *hpriv, 955034d7c13SKuninori Morimoto u16 typeReq, u16 wValue, 956034d7c13SKuninori Morimoto u16 wIndex, char *buf, u16 wLength) 957034d7c13SKuninori Morimoto { 958034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 959034d7c13SKuninori Morimoto struct usb_hub_descriptor *desc = (struct usb_hub_descriptor *)buf; 960034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 961034d7c13SKuninori Morimoto int roothub_id = 1; /* only 1 root hub */ 962034d7c13SKuninori Morimoto 963034d7c13SKuninori Morimoto switch (typeReq) { 964034d7c13SKuninori Morimoto case GetHubStatus: 965034d7c13SKuninori Morimoto dev_dbg(dev, "%s :: GetHubStatus\n", __func__); 966034d7c13SKuninori Morimoto 967034d7c13SKuninori Morimoto *buf = 0x00; 968034d7c13SKuninori Morimoto break; 969034d7c13SKuninori Morimoto 970034d7c13SKuninori Morimoto case GetPortStatus: 971034d7c13SKuninori Morimoto if (wIndex != roothub_id) 972034d7c13SKuninori Morimoto return -EPIPE; 973034d7c13SKuninori Morimoto 974034d7c13SKuninori Morimoto dev_dbg(dev, "%s :: GetPortStatus\n", __func__); 975034d7c13SKuninori Morimoto *(__le32 *)buf = cpu_to_le32(usbhsh_port_stat_get(hpriv)); 976034d7c13SKuninori Morimoto break; 977034d7c13SKuninori Morimoto 978034d7c13SKuninori Morimoto case GetHubDescriptor: 979034d7c13SKuninori Morimoto desc->bDescriptorType = 0x29; 980034d7c13SKuninori Morimoto desc->bHubContrCurrent = 0; 981034d7c13SKuninori Morimoto desc->bNbrPorts = roothub_id; 982034d7c13SKuninori Morimoto desc->bDescLength = 9; 983034d7c13SKuninori Morimoto desc->bPwrOn2PwrGood = 0; 984034d7c13SKuninori Morimoto desc->wHubCharacteristics = cpu_to_le16(0x0011); 985034d7c13SKuninori Morimoto desc->u.hs.DeviceRemovable[0] = (roothub_id << 1); 986034d7c13SKuninori Morimoto desc->u.hs.DeviceRemovable[1] = ~0; 987034d7c13SKuninori Morimoto dev_dbg(dev, "%s :: GetHubDescriptor\n", __func__); 988034d7c13SKuninori Morimoto break; 989034d7c13SKuninori Morimoto } 990034d7c13SKuninori Morimoto 991034d7c13SKuninori Morimoto return 0; 992034d7c13SKuninori Morimoto } 993034d7c13SKuninori Morimoto 994034d7c13SKuninori Morimoto static int usbhsh_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, 995034d7c13SKuninori Morimoto u16 wIndex, char *buf, u16 wLength) 996034d7c13SKuninori Morimoto { 997034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_hcd_to_hpriv(hcd); 998034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 999034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 1000034d7c13SKuninori Morimoto int ret = -EPIPE; 1001034d7c13SKuninori Morimoto 1002034d7c13SKuninori Morimoto switch (typeReq) { 1003034d7c13SKuninori Morimoto 1004034d7c13SKuninori Morimoto /* Hub Feature */ 1005034d7c13SKuninori Morimoto case ClearHubFeature: 1006034d7c13SKuninori Morimoto case SetHubFeature: 1007034d7c13SKuninori Morimoto ret = __usbhsh_hub_hub_feature(hpriv, typeReq, 1008034d7c13SKuninori Morimoto wValue, wIndex, buf, wLength); 1009034d7c13SKuninori Morimoto break; 1010034d7c13SKuninori Morimoto 1011034d7c13SKuninori Morimoto /* Port Feature */ 1012034d7c13SKuninori Morimoto case SetPortFeature: 1013034d7c13SKuninori Morimoto case ClearPortFeature: 1014034d7c13SKuninori Morimoto ret = __usbhsh_hub_port_feature(hpriv, typeReq, 1015034d7c13SKuninori Morimoto wValue, wIndex, buf, wLength); 1016034d7c13SKuninori Morimoto break; 1017034d7c13SKuninori Morimoto 1018034d7c13SKuninori Morimoto /* Get status */ 1019034d7c13SKuninori Morimoto case GetHubStatus: 1020034d7c13SKuninori Morimoto case GetPortStatus: 1021034d7c13SKuninori Morimoto case GetHubDescriptor: 1022034d7c13SKuninori Morimoto ret = __usbhsh_hub_get_status(hpriv, typeReq, 1023034d7c13SKuninori Morimoto wValue, wIndex, buf, wLength); 1024034d7c13SKuninori Morimoto break; 1025034d7c13SKuninori Morimoto } 1026034d7c13SKuninori Morimoto 1027034d7c13SKuninori Morimoto dev_dbg(dev, "typeReq = %x, ret = %d, port_stat = %x\n", 1028034d7c13SKuninori Morimoto typeReq, ret, usbhsh_port_stat_get(hpriv)); 1029034d7c13SKuninori Morimoto 1030034d7c13SKuninori Morimoto return ret; 1031034d7c13SKuninori Morimoto } 1032034d7c13SKuninori Morimoto 1033034d7c13SKuninori Morimoto static struct hc_driver usbhsh_driver = { 1034034d7c13SKuninori Morimoto .description = usbhsh_hcd_name, 1035034d7c13SKuninori Morimoto .hcd_priv_size = sizeof(struct usbhsh_hpriv), 1036034d7c13SKuninori Morimoto 1037034d7c13SKuninori Morimoto /* 1038034d7c13SKuninori Morimoto * generic hardware linkage 1039034d7c13SKuninori Morimoto */ 1040034d7c13SKuninori Morimoto .flags = HCD_USB2, 1041034d7c13SKuninori Morimoto 1042034d7c13SKuninori Morimoto .start = usbhsh_host_start, 1043034d7c13SKuninori Morimoto .stop = usbhsh_host_stop, 1044034d7c13SKuninori Morimoto 1045034d7c13SKuninori Morimoto /* 1046034d7c13SKuninori Morimoto * managing i/o requests and associated device resources 1047034d7c13SKuninori Morimoto */ 1048034d7c13SKuninori Morimoto .urb_enqueue = usbhsh_urb_enqueue, 1049034d7c13SKuninori Morimoto .urb_dequeue = usbhsh_urb_dequeue, 1050034d7c13SKuninori Morimoto .endpoint_disable = usbhsh_endpoint_disable, 1051034d7c13SKuninori Morimoto 1052034d7c13SKuninori Morimoto /* 1053034d7c13SKuninori Morimoto * root hub 1054034d7c13SKuninori Morimoto */ 1055034d7c13SKuninori Morimoto .hub_status_data = usbhsh_hub_status_data, 1056034d7c13SKuninori Morimoto .hub_control = usbhsh_hub_control, 1057034d7c13SKuninori Morimoto }; 1058034d7c13SKuninori Morimoto 1059034d7c13SKuninori Morimoto /* 1060034d7c13SKuninori Morimoto * interrupt functions 1061034d7c13SKuninori Morimoto */ 1062034d7c13SKuninori Morimoto static int usbhsh_irq_attch(struct usbhs_priv *priv, 1063034d7c13SKuninori Morimoto struct usbhs_irq_state *irq_state) 1064034d7c13SKuninori Morimoto { 1065034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 1066034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 1067034d7c13SKuninori Morimoto 1068034d7c13SKuninori Morimoto dev_dbg(dev, "device attached\n"); 1069034d7c13SKuninori Morimoto 1070034d7c13SKuninori Morimoto usbhsh_port_stat_set(hpriv, USB_PORT_STAT_CONNECTION); 1071034d7c13SKuninori Morimoto usbhsh_port_stat_set(hpriv, USB_PORT_STAT_C_CONNECTION << 16); 1072034d7c13SKuninori Morimoto 1073034d7c13SKuninori Morimoto return 0; 1074034d7c13SKuninori Morimoto } 1075034d7c13SKuninori Morimoto 1076034d7c13SKuninori Morimoto static int usbhsh_irq_dtch(struct usbhs_priv *priv, 1077034d7c13SKuninori Morimoto struct usbhs_irq_state *irq_state) 1078034d7c13SKuninori Morimoto { 1079034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 1080034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 1081034d7c13SKuninori Morimoto 1082034d7c13SKuninori Morimoto dev_dbg(dev, "device detached\n"); 1083034d7c13SKuninori Morimoto 1084034d7c13SKuninori Morimoto usbhsh_port_stat_clear(hpriv, USB_PORT_STAT_CONNECTION); 1085034d7c13SKuninori Morimoto usbhsh_port_stat_set(hpriv, USB_PORT_STAT_C_CONNECTION << 16); 1086034d7c13SKuninori Morimoto 1087034d7c13SKuninori Morimoto return 0; 1088034d7c13SKuninori Morimoto } 1089034d7c13SKuninori Morimoto 1090034d7c13SKuninori Morimoto static int usbhsh_irq_setup_ack(struct usbhs_priv *priv, 1091034d7c13SKuninori Morimoto struct usbhs_irq_state *irq_state) 1092034d7c13SKuninori Morimoto { 1093034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 1094034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 1095034d7c13SKuninori Morimoto 1096034d7c13SKuninori Morimoto dev_dbg(dev, "setup packet OK\n"); 1097034d7c13SKuninori Morimoto 1098034d7c13SKuninori Morimoto if (unlikely(!hpriv->done)) 1099034d7c13SKuninori Morimoto dev_err(dev, "setup ack happen without necessary data\n"); 1100034d7c13SKuninori Morimoto else 1101034d7c13SKuninori Morimoto complete(hpriv->done); /* see usbhsh_urb_enqueue() */ 1102034d7c13SKuninori Morimoto 1103034d7c13SKuninori Morimoto return 0; 1104034d7c13SKuninori Morimoto } 1105034d7c13SKuninori Morimoto 1106034d7c13SKuninori Morimoto static int usbhsh_irq_setup_err(struct usbhs_priv *priv, 1107034d7c13SKuninori Morimoto struct usbhs_irq_state *irq_state) 1108034d7c13SKuninori Morimoto { 1109034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 1110034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 1111034d7c13SKuninori Morimoto 1112034d7c13SKuninori Morimoto dev_dbg(dev, "setup packet Err\n"); 1113034d7c13SKuninori Morimoto 1114034d7c13SKuninori Morimoto if (unlikely(!hpriv->done)) 1115034d7c13SKuninori Morimoto dev_err(dev, "setup err happen without necessary data\n"); 1116034d7c13SKuninori Morimoto else 1117034d7c13SKuninori Morimoto complete(hpriv->done); /* see usbhsh_urb_enqueue() */ 1118034d7c13SKuninori Morimoto 1119034d7c13SKuninori Morimoto return 0; 1120034d7c13SKuninori Morimoto } 1121034d7c13SKuninori Morimoto 1122034d7c13SKuninori Morimoto /* 1123034d7c13SKuninori Morimoto * module start/stop 1124034d7c13SKuninori Morimoto */ 1125034d7c13SKuninori Morimoto static void usbhsh_pipe_init_for_host(struct usbhs_priv *priv) 1126034d7c13SKuninori Morimoto { 1127034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 1128034d7c13SKuninori Morimoto struct usbhsh_pipe_info *pipe_info = hpriv->pipe_info; 1129034d7c13SKuninori Morimoto struct usbhs_pipe *pipe; 1130034d7c13SKuninori Morimoto u32 *pipe_type = usbhs_get_dparam(priv, pipe_type); 1131034d7c13SKuninori Morimoto int pipe_size = usbhs_get_dparam(priv, pipe_size); 1132034d7c13SKuninori Morimoto int old_type, dir_in, i; 1133034d7c13SKuninori Morimoto 1134034d7c13SKuninori Morimoto /* init all pipe */ 1135034d7c13SKuninori Morimoto old_type = USB_ENDPOINT_XFER_CONTROL; 1136034d7c13SKuninori Morimoto for (i = 0; i < pipe_size; i++) { 1137034d7c13SKuninori Morimoto pipe_info[i].usr_cnt = 0; 1138034d7c13SKuninori Morimoto 1139034d7c13SKuninori Morimoto /* 1140034d7c13SKuninori Morimoto * data "output" will be finished as soon as possible, 1141034d7c13SKuninori Morimoto * but there is no guaranty at data "input" case. 1142034d7c13SKuninori Morimoto * 1143034d7c13SKuninori Morimoto * "input" needs "standby" pipe. 1144034d7c13SKuninori Morimoto * So, "input" direction pipe > "output" direction pipe 1145034d7c13SKuninori Morimoto * is good idea. 1146034d7c13SKuninori Morimoto * 1147034d7c13SKuninori Morimoto * 1st USB_ENDPOINT_XFER_xxx will be output direction, 1148034d7c13SKuninori Morimoto * and the other will be input direction here. 1149034d7c13SKuninori Morimoto * 1150034d7c13SKuninori Morimoto * ex) 1151034d7c13SKuninori Morimoto * ... 1152034d7c13SKuninori Morimoto * USB_ENDPOINT_XFER_ISOC -> dir out 1153034d7c13SKuninori Morimoto * USB_ENDPOINT_XFER_ISOC -> dir in 1154034d7c13SKuninori Morimoto * USB_ENDPOINT_XFER_BULK -> dir out 1155034d7c13SKuninori Morimoto * USB_ENDPOINT_XFER_BULK -> dir in 1156034d7c13SKuninori Morimoto * USB_ENDPOINT_XFER_BULK -> dir in 1157034d7c13SKuninori Morimoto * ... 1158034d7c13SKuninori Morimoto */ 1159034d7c13SKuninori Morimoto dir_in = (pipe_type[i] == old_type); 1160034d7c13SKuninori Morimoto old_type = pipe_type[i]; 1161034d7c13SKuninori Morimoto 1162034d7c13SKuninori Morimoto if (USB_ENDPOINT_XFER_CONTROL == pipe_type[i]) { 1163034d7c13SKuninori Morimoto pipe = usbhs_dcp_malloc(priv); 1164034d7c13SKuninori Morimoto usbhsh_hpriv_to_dcp(hpriv) = pipe; 1165034d7c13SKuninori Morimoto } else { 1166034d7c13SKuninori Morimoto pipe = usbhs_pipe_malloc(priv, 1167034d7c13SKuninori Morimoto pipe_type[i], 1168034d7c13SKuninori Morimoto dir_in); 1169034d7c13SKuninori Morimoto } 1170034d7c13SKuninori Morimoto 1171034d7c13SKuninori Morimoto pipe->mod_private = pipe_info + i; 1172034d7c13SKuninori Morimoto } 1173034d7c13SKuninori Morimoto } 1174034d7c13SKuninori Morimoto 1175034d7c13SKuninori Morimoto static int usbhsh_start(struct usbhs_priv *priv) 1176034d7c13SKuninori Morimoto { 1177034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 1178034d7c13SKuninori Morimoto struct usb_hcd *hcd = usbhsh_hpriv_to_hcd(hpriv); 1179034d7c13SKuninori Morimoto struct usbhs_mod *mod = usbhs_mod_get_current(priv); 1180034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 1181034d7c13SKuninori Morimoto int ret; 1182034d7c13SKuninori Morimoto 1183034d7c13SKuninori Morimoto /* add hcd */ 1184034d7c13SKuninori Morimoto ret = usb_add_hcd(hcd, 0, 0); 1185034d7c13SKuninori Morimoto if (ret < 0) 1186034d7c13SKuninori Morimoto return 0; 1187034d7c13SKuninori Morimoto 1188034d7c13SKuninori Morimoto /* 1189034d7c13SKuninori Morimoto * pipe initialize and enable DCP 1190034d7c13SKuninori Morimoto */ 1191034d7c13SKuninori Morimoto usbhs_pipe_init(priv, 1192034d7c13SKuninori Morimoto usbhsh_dma_map_ctrl); 1193034d7c13SKuninori Morimoto usbhs_fifo_init(priv); 1194034d7c13SKuninori Morimoto usbhsh_pipe_init_for_host(priv); 1195034d7c13SKuninori Morimoto 1196034d7c13SKuninori Morimoto /* 1197034d7c13SKuninori Morimoto * system config enble 1198034d7c13SKuninori Morimoto * - HI speed 1199034d7c13SKuninori Morimoto * - host 1200034d7c13SKuninori Morimoto * - usb module 1201034d7c13SKuninori Morimoto */ 1202034d7c13SKuninori Morimoto usbhs_sys_hispeed_ctrl(priv, 1); 1203034d7c13SKuninori Morimoto usbhs_sys_host_ctrl(priv, 1); 1204034d7c13SKuninori Morimoto usbhs_sys_usb_ctrl(priv, 1); 1205034d7c13SKuninori Morimoto 1206034d7c13SKuninori Morimoto /* 1207034d7c13SKuninori Morimoto * enable irq callback 1208034d7c13SKuninori Morimoto */ 1209034d7c13SKuninori Morimoto mod->irq_attch = usbhsh_irq_attch; 1210034d7c13SKuninori Morimoto mod->irq_dtch = usbhsh_irq_dtch; 1211034d7c13SKuninori Morimoto mod->irq_sack = usbhsh_irq_setup_ack; 1212034d7c13SKuninori Morimoto mod->irq_sign = usbhsh_irq_setup_err; 1213034d7c13SKuninori Morimoto usbhs_irq_callback_update(priv, mod); 1214034d7c13SKuninori Morimoto 1215034d7c13SKuninori Morimoto dev_dbg(dev, "start host\n"); 1216034d7c13SKuninori Morimoto 1217034d7c13SKuninori Morimoto return ret; 1218034d7c13SKuninori Morimoto } 1219034d7c13SKuninori Morimoto 1220034d7c13SKuninori Morimoto static int usbhsh_stop(struct usbhs_priv *priv) 1221034d7c13SKuninori Morimoto { 1222034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 1223034d7c13SKuninori Morimoto struct usb_hcd *hcd = usbhsh_hpriv_to_hcd(hpriv); 1224034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 1225034d7c13SKuninori Morimoto 1226034d7c13SKuninori Morimoto usb_remove_hcd(hcd); 1227034d7c13SKuninori Morimoto 1228034d7c13SKuninori Morimoto /* disable sys */ 1229034d7c13SKuninori Morimoto usbhs_sys_hispeed_ctrl(priv, 0); 1230034d7c13SKuninori Morimoto usbhs_sys_host_ctrl(priv, 0); 1231034d7c13SKuninori Morimoto usbhs_sys_usb_ctrl(priv, 0); 1232034d7c13SKuninori Morimoto 1233034d7c13SKuninori Morimoto dev_dbg(dev, "quit host\n"); 1234034d7c13SKuninori Morimoto 1235034d7c13SKuninori Morimoto return 0; 1236034d7c13SKuninori Morimoto } 1237034d7c13SKuninori Morimoto 1238034d7c13SKuninori Morimoto int __devinit usbhs_mod_host_probe(struct usbhs_priv *priv) 1239034d7c13SKuninori Morimoto { 1240034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv; 1241034d7c13SKuninori Morimoto struct usb_hcd *hcd; 1242034d7c13SKuninori Morimoto struct usbhsh_pipe_info *pipe_info; 1243034d7c13SKuninori Morimoto struct usbhsh_device *udev; 1244034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 1245034d7c13SKuninori Morimoto int pipe_size = usbhs_get_dparam(priv, pipe_size); 1246034d7c13SKuninori Morimoto int i; 1247034d7c13SKuninori Morimoto 1248034d7c13SKuninori Morimoto /* initialize hcd */ 1249034d7c13SKuninori Morimoto hcd = usb_create_hcd(&usbhsh_driver, dev, usbhsh_hcd_name); 1250034d7c13SKuninori Morimoto if (!hcd) { 1251034d7c13SKuninori Morimoto dev_err(dev, "Failed to create hcd\n"); 1252034d7c13SKuninori Morimoto return -ENOMEM; 1253034d7c13SKuninori Morimoto } 1254034d7c13SKuninori Morimoto 1255034d7c13SKuninori Morimoto pipe_info = kzalloc(sizeof(*pipe_info) * pipe_size, GFP_KERNEL); 1256034d7c13SKuninori Morimoto if (!pipe_info) { 1257034d7c13SKuninori Morimoto dev_err(dev, "Could not allocate pipe_info\n"); 1258034d7c13SKuninori Morimoto goto usbhs_mod_host_probe_err; 1259034d7c13SKuninori Morimoto } 1260034d7c13SKuninori Morimoto 1261034d7c13SKuninori Morimoto /* 1262034d7c13SKuninori Morimoto * CAUTION 1263034d7c13SKuninori Morimoto * 1264034d7c13SKuninori Morimoto * There is no guarantee that it is possible to access usb module here. 1265034d7c13SKuninori Morimoto * Don't accesses to it. 1266034d7c13SKuninori Morimoto * The accesse will be enable after "usbhsh_start" 1267034d7c13SKuninori Morimoto */ 1268034d7c13SKuninori Morimoto 1269034d7c13SKuninori Morimoto hpriv = usbhsh_hcd_to_hpriv(hcd); 1270034d7c13SKuninori Morimoto 1271034d7c13SKuninori Morimoto /* 1272034d7c13SKuninori Morimoto * register itself 1273034d7c13SKuninori Morimoto */ 1274034d7c13SKuninori Morimoto usbhs_mod_register(priv, &hpriv->mod, USBHS_HOST); 1275034d7c13SKuninori Morimoto 1276034d7c13SKuninori Morimoto /* init hpriv */ 1277034d7c13SKuninori Morimoto hpriv->mod.name = "host"; 1278034d7c13SKuninori Morimoto hpriv->mod.start = usbhsh_start; 1279034d7c13SKuninori Morimoto hpriv->mod.stop = usbhsh_stop; 1280034d7c13SKuninori Morimoto hpriv->pipe_info = pipe_info; 1281034d7c13SKuninori Morimoto hpriv->pipe_size = pipe_size; 1282034d7c13SKuninori Morimoto hpriv->done = NULL; 1283034d7c13SKuninori Morimoto usbhsh_req_list_init(hpriv); 1284034d7c13SKuninori Morimoto usbhsh_port_stat_init(hpriv); 1285034d7c13SKuninori Morimoto 1286034d7c13SKuninori Morimoto /* init all device */ 1287034d7c13SKuninori Morimoto usbhsh_for_each_udev_with_dev0(udev, hpriv, i) { 1288034d7c13SKuninori Morimoto udev->usbv = NULL; 1289034d7c13SKuninori Morimoto INIT_LIST_HEAD(&udev->ep_list_head); 1290034d7c13SKuninori Morimoto } 1291034d7c13SKuninori Morimoto 1292034d7c13SKuninori Morimoto dev_info(dev, "host probed\n"); 1293034d7c13SKuninori Morimoto 1294034d7c13SKuninori Morimoto return 0; 1295034d7c13SKuninori Morimoto 1296034d7c13SKuninori Morimoto usbhs_mod_host_probe_err: 1297034d7c13SKuninori Morimoto usb_put_hcd(hcd); 1298034d7c13SKuninori Morimoto 1299034d7c13SKuninori Morimoto return -ENOMEM; 1300034d7c13SKuninori Morimoto } 1301034d7c13SKuninori Morimoto 1302034d7c13SKuninori Morimoto int __devexit usbhs_mod_host_remove(struct usbhs_priv *priv) 1303034d7c13SKuninori Morimoto { 1304034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 1305034d7c13SKuninori Morimoto struct usb_hcd *hcd = usbhsh_hpriv_to_hcd(hpriv); 1306034d7c13SKuninori Morimoto 1307034d7c13SKuninori Morimoto usbhsh_req_list_quit(hpriv); 1308034d7c13SKuninori Morimoto 1309034d7c13SKuninori Morimoto usb_put_hcd(hcd); 1310034d7c13SKuninori Morimoto 1311034d7c13SKuninori Morimoto return 0; 1312034d7c13SKuninori Morimoto } 1313