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 }; 78034d7c13SKuninori Morimoto 79034d7c13SKuninori Morimoto struct usbhsh_device { 80034d7c13SKuninori Morimoto struct usb_device *usbv; 81034d7c13SKuninori Morimoto struct list_head ep_list_head; /* list of usbhsh_ep */ 82034d7c13SKuninori Morimoto }; 83034d7c13SKuninori Morimoto 84034d7c13SKuninori Morimoto struct usbhsh_ep { 85034d7c13SKuninori Morimoto struct usbhs_pipe *pipe; 86034d7c13SKuninori Morimoto struct usbhsh_device *udev; /* attached udev */ 87034d7c13SKuninori Morimoto struct list_head ep_list; /* list to usbhsh_device */ 88034d7c13SKuninori Morimoto 89034d7c13SKuninori Morimoto int maxp; 90034d7c13SKuninori Morimoto }; 91034d7c13SKuninori Morimoto 92034d7c13SKuninori Morimoto #define USBHSH_DEVICE_MAX 10 /* see DEVADDn / DCPMAXP / PIPEMAXP */ 93034d7c13SKuninori Morimoto #define USBHSH_PORT_MAX 7 /* see DEVADDn :: HUBPORT */ 94034d7c13SKuninori Morimoto struct usbhsh_hpriv { 95034d7c13SKuninori Morimoto struct usbhs_mod mod; 96034d7c13SKuninori Morimoto struct usbhs_pipe *dcp; 97034d7c13SKuninori Morimoto 98034d7c13SKuninori Morimoto struct usbhsh_device udev[USBHSH_DEVICE_MAX]; 99034d7c13SKuninori Morimoto 100034d7c13SKuninori Morimoto struct usbhsh_pipe_info *pipe_info; 101034d7c13SKuninori Morimoto int pipe_size; 102034d7c13SKuninori Morimoto 103034d7c13SKuninori Morimoto u32 port_stat; /* USB_PORT_STAT_xxx */ 104034d7c13SKuninori Morimoto 1057fccd480SKuninori Morimoto struct completion setup_ack_done; 106034d7c13SKuninori Morimoto }; 107034d7c13SKuninori Morimoto 108034d7c13SKuninori Morimoto 109034d7c13SKuninori Morimoto static const char usbhsh_hcd_name[] = "renesas_usbhs host"; 110034d7c13SKuninori Morimoto 111034d7c13SKuninori Morimoto /* 112034d7c13SKuninori Morimoto * macro 113034d7c13SKuninori Morimoto */ 114034d7c13SKuninori Morimoto #define usbhsh_priv_to_hpriv(priv) \ 115034d7c13SKuninori Morimoto container_of(usbhs_mod_get(priv, USBHS_HOST), struct usbhsh_hpriv, mod) 116034d7c13SKuninori Morimoto 117034d7c13SKuninori Morimoto #define __usbhsh_for_each_hpipe(start, pos, h, i) \ 118034d7c13SKuninori Morimoto for (i = start, pos = (h)->hpipe + i; \ 119034d7c13SKuninori Morimoto i < (h)->hpipe_size; \ 120034d7c13SKuninori Morimoto i++, pos = (h)->hpipe + i) 121034d7c13SKuninori Morimoto 122034d7c13SKuninori Morimoto #define usbhsh_for_each_hpipe(pos, hpriv, i) \ 123034d7c13SKuninori Morimoto __usbhsh_for_each_hpipe(1, pos, hpriv, i) 124034d7c13SKuninori Morimoto 125034d7c13SKuninori Morimoto #define usbhsh_for_each_hpipe_with_dcp(pos, hpriv, i) \ 126034d7c13SKuninori Morimoto __usbhsh_for_each_hpipe(0, pos, hpriv, i) 127034d7c13SKuninori Morimoto 128034d7c13SKuninori Morimoto #define __usbhsh_for_each_udev(start, pos, h, i) \ 129034d7c13SKuninori Morimoto for (i = start, pos = (h)->udev + i; \ 130034d7c13SKuninori Morimoto i < USBHSH_DEVICE_MAX; \ 131034d7c13SKuninori Morimoto i++, pos = (h)->udev + i) 132034d7c13SKuninori Morimoto 133034d7c13SKuninori Morimoto #define usbhsh_for_each_udev(pos, hpriv, i) \ 134034d7c13SKuninori Morimoto __usbhsh_for_each_udev(1, pos, hpriv, i) 135034d7c13SKuninori Morimoto 136034d7c13SKuninori Morimoto #define usbhsh_for_each_udev_with_dev0(pos, hpriv, i) \ 137034d7c13SKuninori Morimoto __usbhsh_for_each_udev(0, pos, hpriv, i) 138034d7c13SKuninori Morimoto 139034d7c13SKuninori Morimoto #define usbhsh_hcd_to_hpriv(h) (struct usbhsh_hpriv *)((h)->hcd_priv) 140034d7c13SKuninori Morimoto #define usbhsh_hcd_to_dev(h) ((h)->self.controller) 141034d7c13SKuninori Morimoto 142034d7c13SKuninori Morimoto #define usbhsh_hpriv_to_priv(h) ((h)->mod.priv) 143034d7c13SKuninori Morimoto #define usbhsh_hpriv_to_dcp(h) ((h)->dcp) 144034d7c13SKuninori Morimoto #define usbhsh_hpriv_to_hcd(h) \ 145034d7c13SKuninori Morimoto container_of((void *)h, struct usb_hcd, hcd_priv) 146034d7c13SKuninori Morimoto 147034d7c13SKuninori Morimoto #define usbhsh_ep_to_uep(u) ((u)->hcpriv) 148034d7c13SKuninori Morimoto #define usbhsh_uep_to_pipe(u) ((u)->pipe) 149034d7c13SKuninori Morimoto #define usbhsh_uep_to_udev(u) ((u)->udev) 150034d7c13SKuninori Morimoto #define usbhsh_urb_to_ureq(u) ((u)->hcpriv) 151034d7c13SKuninori Morimoto #define usbhsh_urb_to_usbv(u) ((u)->dev) 152034d7c13SKuninori Morimoto 153034d7c13SKuninori Morimoto #define usbhsh_usbv_to_udev(d) dev_get_drvdata(&(d)->dev) 154034d7c13SKuninori Morimoto 155034d7c13SKuninori Morimoto #define usbhsh_udev_to_usbv(h) ((h)->usbv) 156ab142308SKuninori Morimoto #define usbhsh_udev_is_used(h) usbhsh_udev_to_usbv(h) 157034d7c13SKuninori Morimoto 158034d7c13SKuninori Morimoto #define usbhsh_pipe_info(p) ((p)->mod_private) 159034d7c13SKuninori Morimoto 1609c673652SKuninori Morimoto #define usbhsh_device_parent(d) (usbhsh_usbv_to_udev((d)->usbv->parent)) 1619c673652SKuninori Morimoto #define usbhsh_device_hubport(d) ((d)->usbv->portnum) 162034d7c13SKuninori Morimoto #define usbhsh_device_number(h, d) ((int)((d) - (h)->udev)) 163034d7c13SKuninori Morimoto #define usbhsh_device_nth(h, d) ((h)->udev + d) 164034d7c13SKuninori Morimoto #define usbhsh_device0(h) usbhsh_device_nth(h, 0) 165034d7c13SKuninori Morimoto 166034d7c13SKuninori Morimoto #define usbhsh_port_stat_init(h) ((h)->port_stat = 0) 167034d7c13SKuninori Morimoto #define usbhsh_port_stat_set(h, s) ((h)->port_stat |= (s)) 168034d7c13SKuninori Morimoto #define usbhsh_port_stat_clear(h, s) ((h)->port_stat &= ~(s)) 169034d7c13SKuninori Morimoto #define usbhsh_port_stat_get(h) ((h)->port_stat) 170034d7c13SKuninori Morimoto 17125234b46SKuninori Morimoto #define usbhsh_pkt_to_ureq(p) \ 172034d7c13SKuninori Morimoto container_of((void *)p, struct usbhsh_request, pkt) 173034d7c13SKuninori Morimoto 174034d7c13SKuninori Morimoto /* 175034d7c13SKuninori Morimoto * req alloc/free 176034d7c13SKuninori Morimoto */ 17725234b46SKuninori Morimoto static struct usbhsh_request *usbhsh_ureq_alloc(struct usbhsh_hpriv *hpriv, 178034d7c13SKuninori Morimoto struct urb *urb, 179034d7c13SKuninori Morimoto gfp_t mem_flags) 180034d7c13SKuninori Morimoto { 181034d7c13SKuninori Morimoto struct usbhsh_request *ureq; 182034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 183034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 184034d7c13SKuninori Morimoto 185034d7c13SKuninori Morimoto ureq = kzalloc(sizeof(struct usbhsh_request), mem_flags); 186034d7c13SKuninori Morimoto if (!ureq) { 187034d7c13SKuninori Morimoto dev_err(dev, "ureq alloc fail\n"); 188034d7c13SKuninori Morimoto return NULL; 189034d7c13SKuninori Morimoto } 190034d7c13SKuninori Morimoto 191034d7c13SKuninori Morimoto usbhs_pkt_init(&ureq->pkt); 192034d7c13SKuninori Morimoto ureq->urb = urb; 193fc9d5c79SKuninori Morimoto usbhsh_urb_to_ureq(urb) = ureq; 194034d7c13SKuninori Morimoto 195034d7c13SKuninori Morimoto return ureq; 196034d7c13SKuninori Morimoto } 197034d7c13SKuninori Morimoto 19825234b46SKuninori Morimoto static void usbhsh_ureq_free(struct usbhsh_hpriv *hpriv, 199034d7c13SKuninori Morimoto struct usbhsh_request *ureq) 200034d7c13SKuninori Morimoto { 201fc9d5c79SKuninori Morimoto usbhsh_urb_to_ureq(ureq->urb) = NULL; 202034d7c13SKuninori Morimoto ureq->urb = NULL; 203c5b963f8SKuninori Morimoto 204c5b963f8SKuninori Morimoto kfree(ureq); 205034d7c13SKuninori Morimoto } 206034d7c13SKuninori Morimoto 207034d7c13SKuninori Morimoto /* 208034d7c13SKuninori Morimoto * device control 209034d7c13SKuninori Morimoto */ 2109c673652SKuninori Morimoto static int usbhsh_connected_to_rhdev(struct usb_hcd *hcd, 2119c673652SKuninori Morimoto struct usbhsh_device *udev) 2129c673652SKuninori Morimoto { 2139c673652SKuninori Morimoto struct usb_device *usbv = usbhsh_udev_to_usbv(udev); 2149c673652SKuninori Morimoto 2159c673652SKuninori Morimoto return hcd->self.root_hub == usbv->parent; 2169c673652SKuninori Morimoto } 217034d7c13SKuninori Morimoto 218034d7c13SKuninori Morimoto static int usbhsh_device_has_endpoint(struct usbhsh_device *udev) 219034d7c13SKuninori Morimoto { 220034d7c13SKuninori Morimoto return !list_empty(&udev->ep_list_head); 221034d7c13SKuninori Morimoto } 222034d7c13SKuninori Morimoto 223034d7c13SKuninori Morimoto static struct usbhsh_device *usbhsh_device_alloc(struct usbhsh_hpriv *hpriv, 224034d7c13SKuninori Morimoto struct urb *urb) 225034d7c13SKuninori Morimoto { 226034d7c13SKuninori Morimoto struct usbhsh_device *udev = NULL; 227034d7c13SKuninori Morimoto struct usb_hcd *hcd = usbhsh_hpriv_to_hcd(hpriv); 228034d7c13SKuninori Morimoto struct device *dev = usbhsh_hcd_to_dev(hcd); 229034d7c13SKuninori Morimoto struct usb_device *usbv = usbhsh_urb_to_usbv(urb); 230034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 231d399f90dSKuninori Morimoto unsigned long flags; 2329c673652SKuninori Morimoto u16 upphub, hubport; 233034d7c13SKuninori Morimoto int i; 234034d7c13SKuninori Morimoto 235d399f90dSKuninori Morimoto /******************** spin lock ********************/ 236d399f90dSKuninori Morimoto usbhs_lock(priv, flags); 237d399f90dSKuninori Morimoto 238034d7c13SKuninori Morimoto /* 239ab142308SKuninori Morimoto * find device 240034d7c13SKuninori Morimoto */ 241034d7c13SKuninori Morimoto if (0 == usb_pipedevice(urb->pipe)) { 242ab142308SKuninori Morimoto /* 243ab142308SKuninori Morimoto * device0 is special case 244ab142308SKuninori Morimoto */ 245034d7c13SKuninori Morimoto udev = usbhsh_device0(hpriv); 246ab142308SKuninori Morimoto if (usbhsh_udev_is_used(udev)) 247ab142308SKuninori Morimoto udev = NULL; 248ab142308SKuninori Morimoto } else { 249ab142308SKuninori Morimoto struct usbhsh_device *pos; 250034d7c13SKuninori Morimoto 251034d7c13SKuninori Morimoto /* 252034d7c13SKuninori Morimoto * find unused device 253034d7c13SKuninori Morimoto */ 254ab142308SKuninori Morimoto usbhsh_for_each_udev(pos, hpriv, i) { 255ab142308SKuninori Morimoto if (usbhsh_udev_is_used(pos)) 256034d7c13SKuninori Morimoto continue; 257ab142308SKuninori Morimoto udev = pos; 258ab142308SKuninori Morimoto break; 259ab142308SKuninori Morimoto } 260034d7c13SKuninori Morimoto } 261034d7c13SKuninori Morimoto 262d399f90dSKuninori Morimoto if (udev) { 263d399f90dSKuninori Morimoto /* 264d399f90dSKuninori Morimoto * usbhsh_usbv_to_udev() 265d399f90dSKuninori Morimoto * usbhsh_udev_to_usbv() 266d399f90dSKuninori Morimoto * will be enable 267d399f90dSKuninori Morimoto */ 268d399f90dSKuninori Morimoto dev_set_drvdata(&usbv->dev, udev); 269d399f90dSKuninori Morimoto udev->usbv = usbv; 270d399f90dSKuninori Morimoto } 271d399f90dSKuninori Morimoto 272d399f90dSKuninori Morimoto usbhs_unlock(priv, flags); 273d399f90dSKuninori Morimoto /******************** spin unlock ******************/ 274d399f90dSKuninori Morimoto 275ab142308SKuninori Morimoto if (!udev) { 276034d7c13SKuninori Morimoto dev_err(dev, "no free usbhsh_device\n"); 277034d7c13SKuninori Morimoto return NULL; 278ab142308SKuninori Morimoto } 279034d7c13SKuninori Morimoto 280034d7c13SKuninori Morimoto if (usbhsh_device_has_endpoint(udev)) 281034d7c13SKuninori Morimoto dev_warn(dev, "udev have old endpoint\n"); 282034d7c13SKuninori Morimoto 283034d7c13SKuninori Morimoto /* uep will be attached */ 284034d7c13SKuninori Morimoto INIT_LIST_HEAD(&udev->ep_list_head); 285034d7c13SKuninori Morimoto 2869c673652SKuninori Morimoto upphub = 0; 2879c673652SKuninori Morimoto hubport = 0; 2889c673652SKuninori Morimoto if (!usbhsh_connected_to_rhdev(hcd, udev)) { 2899c673652SKuninori Morimoto /* if udev is not connected to rhdev, it means parent is Hub */ 2909c673652SKuninori Morimoto struct usbhsh_device *parent = usbhsh_device_parent(udev); 2919c673652SKuninori Morimoto 2929c673652SKuninori Morimoto upphub = usbhsh_device_number(hpriv, parent); 2939c673652SKuninori Morimoto hubport = usbhsh_device_hubport(udev); 2949c673652SKuninori Morimoto 2959c673652SKuninori Morimoto dev_dbg(dev, "%s connecte to Hub [%d:%d](%p)\n", __func__, 2969c673652SKuninori Morimoto upphub, hubport, parent); 2979c673652SKuninori Morimoto } 2989c673652SKuninori Morimoto 299034d7c13SKuninori Morimoto /* set device config */ 3003dd49268SKuninori Morimoto usbhs_set_device_config(priv, 301034d7c13SKuninori Morimoto usbhsh_device_number(hpriv, udev), 3029c673652SKuninori Morimoto upphub, hubport, usbv->speed); 303034d7c13SKuninori Morimoto 304034d7c13SKuninori Morimoto dev_dbg(dev, "%s [%d](%p)\n", __func__, 305034d7c13SKuninori Morimoto usbhsh_device_number(hpriv, udev), udev); 306034d7c13SKuninori Morimoto 307034d7c13SKuninori Morimoto return udev; 308034d7c13SKuninori Morimoto } 309034d7c13SKuninori Morimoto 310034d7c13SKuninori Morimoto static void usbhsh_device_free(struct usbhsh_hpriv *hpriv, 311034d7c13SKuninori Morimoto struct usbhsh_device *udev) 312034d7c13SKuninori Morimoto { 313034d7c13SKuninori Morimoto struct usb_hcd *hcd = usbhsh_hpriv_to_hcd(hpriv); 314d399f90dSKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 315034d7c13SKuninori Morimoto struct device *dev = usbhsh_hcd_to_dev(hcd); 316034d7c13SKuninori Morimoto struct usb_device *usbv = usbhsh_udev_to_usbv(udev); 317d399f90dSKuninori Morimoto unsigned long flags; 318034d7c13SKuninori Morimoto 319034d7c13SKuninori Morimoto dev_dbg(dev, "%s [%d](%p)\n", __func__, 320034d7c13SKuninori Morimoto usbhsh_device_number(hpriv, udev), udev); 321034d7c13SKuninori Morimoto 322034d7c13SKuninori Morimoto if (usbhsh_device_has_endpoint(udev)) 323034d7c13SKuninori Morimoto dev_warn(dev, "udev still have endpoint\n"); 324034d7c13SKuninori Morimoto 325d399f90dSKuninori Morimoto /******************** spin lock ********************/ 326d399f90dSKuninori Morimoto usbhs_lock(priv, flags); 327d399f90dSKuninori Morimoto 328034d7c13SKuninori Morimoto /* 329034d7c13SKuninori Morimoto * usbhsh_usbv_to_udev() 330034d7c13SKuninori Morimoto * usbhsh_udev_to_usbv() 331034d7c13SKuninori Morimoto * will be disable 332034d7c13SKuninori Morimoto */ 333034d7c13SKuninori Morimoto dev_set_drvdata(&usbv->dev, NULL); 334034d7c13SKuninori Morimoto udev->usbv = NULL; 335d399f90dSKuninori Morimoto 336d399f90dSKuninori Morimoto usbhs_unlock(priv, flags); 337d399f90dSKuninori Morimoto /******************** spin unlock ******************/ 338034d7c13SKuninori Morimoto } 339034d7c13SKuninori Morimoto 340034d7c13SKuninori Morimoto /* 341034d7c13SKuninori Morimoto * end-point control 342034d7c13SKuninori Morimoto */ 343034d7c13SKuninori Morimoto struct usbhsh_ep *usbhsh_endpoint_alloc(struct usbhsh_hpriv *hpriv, 344034d7c13SKuninori Morimoto struct usbhsh_device *udev, 345034d7c13SKuninori Morimoto struct usb_host_endpoint *ep, 34673ef635aSKuninori Morimoto int dir_in_req, 347034d7c13SKuninori Morimoto gfp_t mem_flags) 348034d7c13SKuninori Morimoto { 349034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 350034d7c13SKuninori Morimoto struct usb_hcd *hcd = usbhsh_hpriv_to_hcd(hpriv); 351034d7c13SKuninori Morimoto struct usbhsh_ep *uep; 352034d7c13SKuninori Morimoto struct usbhsh_pipe_info *info; 353034d7c13SKuninori Morimoto struct usbhs_pipe *pipe, *best_pipe; 354034d7c13SKuninori Morimoto struct device *dev = usbhsh_hcd_to_dev(hcd); 355034d7c13SKuninori Morimoto struct usb_endpoint_descriptor *desc = &ep->desc; 35673ef635aSKuninori Morimoto int type, i, dir_in; 357034d7c13SKuninori Morimoto unsigned int min_usr; 358d399f90dSKuninori Morimoto unsigned long flags; 359034d7c13SKuninori Morimoto 36073ef635aSKuninori Morimoto dir_in_req = !!dir_in_req; 36173ef635aSKuninori Morimoto 362034d7c13SKuninori Morimoto uep = kzalloc(sizeof(struct usbhsh_ep), mem_flags); 363034d7c13SKuninori Morimoto if (!uep) { 364034d7c13SKuninori Morimoto dev_err(dev, "usbhsh_ep alloc fail\n"); 365034d7c13SKuninori Morimoto return NULL; 366034d7c13SKuninori Morimoto } 36773ef635aSKuninori Morimoto 36873ef635aSKuninori Morimoto if (usb_endpoint_xfer_control(desc)) { 36973ef635aSKuninori Morimoto best_pipe = usbhsh_hpriv_to_dcp(hpriv); 37073ef635aSKuninori Morimoto goto usbhsh_endpoint_alloc_find_pipe; 37173ef635aSKuninori Morimoto } 372034d7c13SKuninori Morimoto 373d399f90dSKuninori Morimoto /******************** spin lock ********************/ 374d399f90dSKuninori Morimoto usbhs_lock(priv, flags); 375d399f90dSKuninori Morimoto 376034d7c13SKuninori Morimoto /* 377034d7c13SKuninori Morimoto * find best pipe for endpoint 378034d7c13SKuninori Morimoto * see 379034d7c13SKuninori Morimoto * HARDWARE LIMITATION 380034d7c13SKuninori Morimoto */ 38173ef635aSKuninori Morimoto type = usb_endpoint_type(desc); 382034d7c13SKuninori Morimoto min_usr = ~0; 383034d7c13SKuninori Morimoto best_pipe = NULL; 38473ef635aSKuninori Morimoto usbhs_for_each_pipe(pipe, priv, i) { 385034d7c13SKuninori Morimoto if (!usbhs_pipe_type_is(pipe, type)) 386034d7c13SKuninori Morimoto continue; 387034d7c13SKuninori Morimoto 38873ef635aSKuninori Morimoto dir_in = !!usbhs_pipe_is_dir_in(pipe); 38973ef635aSKuninori Morimoto if (0 != (dir_in - dir_in_req)) 39073ef635aSKuninori Morimoto continue; 39173ef635aSKuninori Morimoto 392034d7c13SKuninori Morimoto info = usbhsh_pipe_info(pipe); 393034d7c13SKuninori Morimoto 394034d7c13SKuninori Morimoto if (min_usr > info->usr_cnt) { 395034d7c13SKuninori Morimoto min_usr = info->usr_cnt; 396034d7c13SKuninori Morimoto best_pipe = pipe; 397034d7c13SKuninori Morimoto } 398034d7c13SKuninori Morimoto } 399034d7c13SKuninori Morimoto 400d399f90dSKuninori Morimoto if (best_pipe) { 401d399f90dSKuninori Morimoto /* update pipe user count */ 402d399f90dSKuninori Morimoto info = usbhsh_pipe_info(best_pipe); 403d399f90dSKuninori Morimoto info->usr_cnt++; 404d399f90dSKuninori Morimoto 405d399f90dSKuninori Morimoto /* init this endpoint, and attach it to udev */ 406d399f90dSKuninori Morimoto INIT_LIST_HEAD(&uep->ep_list); 407d399f90dSKuninori Morimoto list_add_tail(&uep->ep_list, &udev->ep_list_head); 408d399f90dSKuninori Morimoto } 409d399f90dSKuninori Morimoto 410d399f90dSKuninori Morimoto usbhs_unlock(priv, flags); 411d399f90dSKuninori Morimoto /******************** spin unlock ******************/ 412d399f90dSKuninori Morimoto 413034d7c13SKuninori Morimoto if (unlikely(!best_pipe)) { 414034d7c13SKuninori Morimoto dev_err(dev, "couldn't find best pipe\n"); 415034d7c13SKuninori Morimoto kfree(uep); 416034d7c13SKuninori Morimoto return NULL; 417034d7c13SKuninori Morimoto } 41873ef635aSKuninori Morimoto usbhsh_endpoint_alloc_find_pipe: 419034d7c13SKuninori Morimoto /* 420034d7c13SKuninori Morimoto * init uep 421034d7c13SKuninori Morimoto */ 422034d7c13SKuninori Morimoto uep->pipe = best_pipe; 423034d7c13SKuninori Morimoto uep->maxp = usb_endpoint_maxp(desc); 424034d7c13SKuninori Morimoto usbhsh_uep_to_udev(uep) = udev; 425034d7c13SKuninori Morimoto usbhsh_ep_to_uep(ep) = uep; 426034d7c13SKuninori Morimoto 427034d7c13SKuninori Morimoto /* 428034d7c13SKuninori Morimoto * usbhs_pipe_config_update() should be called after 4293dd49268SKuninori Morimoto * usbhs_set_device_config() 430034d7c13SKuninori Morimoto * see 431034d7c13SKuninori Morimoto * DCPMAXP/PIPEMAXP 432034d7c13SKuninori Morimoto */ 433d7a00ec1SKuninori Morimoto usbhs_pipe_sequence_data0(uep->pipe); 434034d7c13SKuninori Morimoto usbhs_pipe_config_update(uep->pipe, 435034d7c13SKuninori Morimoto usbhsh_device_number(hpriv, udev), 436034d7c13SKuninori Morimoto usb_endpoint_num(desc), 437034d7c13SKuninori Morimoto uep->maxp); 438034d7c13SKuninori Morimoto 439034d7c13SKuninori Morimoto dev_dbg(dev, "%s [%d-%s](%p)\n", __func__, 440034d7c13SKuninori Morimoto usbhsh_device_number(hpriv, udev), 44173ef635aSKuninori Morimoto usbhs_pipe_name(uep->pipe), uep); 442034d7c13SKuninori Morimoto 443034d7c13SKuninori Morimoto return uep; 444034d7c13SKuninori Morimoto } 445034d7c13SKuninori Morimoto 446034d7c13SKuninori Morimoto void usbhsh_endpoint_free(struct usbhsh_hpriv *hpriv, 447034d7c13SKuninori Morimoto struct usb_host_endpoint *ep) 448034d7c13SKuninori Morimoto { 449034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 450034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 451034d7c13SKuninori Morimoto struct usbhsh_ep *uep = usbhsh_ep_to_uep(ep); 452034d7c13SKuninori Morimoto struct usbhsh_pipe_info *info; 453d399f90dSKuninori Morimoto unsigned long flags; 454034d7c13SKuninori Morimoto 455034d7c13SKuninori Morimoto if (!uep) 456034d7c13SKuninori Morimoto return; 457034d7c13SKuninori Morimoto 458034d7c13SKuninori Morimoto dev_dbg(dev, "%s [%d-%s](%p)\n", __func__, 45955b5a624SKuninori Morimoto usbhsh_device_number(hpriv, usbhsh_uep_to_udev(uep)), 460034d7c13SKuninori Morimoto usbhs_pipe_name(uep->pipe), uep); 461034d7c13SKuninori Morimoto 462d399f90dSKuninori Morimoto /******************** spin lock ********************/ 463d399f90dSKuninori Morimoto usbhs_lock(priv, flags); 464d399f90dSKuninori Morimoto 465034d7c13SKuninori Morimoto info = usbhsh_pipe_info(uep->pipe); 466034d7c13SKuninori Morimoto info->usr_cnt--; 467034d7c13SKuninori Morimoto 468034d7c13SKuninori Morimoto /* remove this endpoint from udev */ 469034d7c13SKuninori Morimoto list_del_init(&uep->ep_list); 470034d7c13SKuninori Morimoto 471034d7c13SKuninori Morimoto usbhsh_uep_to_udev(uep) = NULL; 472034d7c13SKuninori Morimoto usbhsh_ep_to_uep(ep) = NULL; 473034d7c13SKuninori Morimoto 474d399f90dSKuninori Morimoto usbhs_unlock(priv, flags); 475d399f90dSKuninori Morimoto /******************** spin unlock ******************/ 476d399f90dSKuninori Morimoto 477034d7c13SKuninori Morimoto kfree(uep); 478034d7c13SKuninori Morimoto } 479034d7c13SKuninori Morimoto 480034d7c13SKuninori Morimoto /* 481034d7c13SKuninori Morimoto * queue push/pop 482034d7c13SKuninori Morimoto */ 483034d7c13SKuninori Morimoto static void usbhsh_queue_done(struct usbhs_priv *priv, struct usbhs_pkt *pkt) 484034d7c13SKuninori Morimoto { 48525234b46SKuninori Morimoto struct usbhsh_request *ureq = usbhsh_pkt_to_ureq(pkt); 486034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 487034d7c13SKuninori Morimoto struct usb_hcd *hcd = usbhsh_hpriv_to_hcd(hpriv); 488034d7c13SKuninori Morimoto struct urb *urb = ureq->urb; 489034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 490034d7c13SKuninori Morimoto 491034d7c13SKuninori Morimoto dev_dbg(dev, "%s\n", __func__); 492034d7c13SKuninori Morimoto 493034d7c13SKuninori Morimoto if (!urb) { 494034d7c13SKuninori Morimoto dev_warn(dev, "pkt doesn't have urb\n"); 495034d7c13SKuninori Morimoto return; 496034d7c13SKuninori Morimoto } 497034d7c13SKuninori Morimoto 498034d7c13SKuninori Morimoto urb->actual_length = pkt->actual; 49925234b46SKuninori Morimoto usbhsh_ureq_free(hpriv, ureq); 500034d7c13SKuninori Morimoto 501034d7c13SKuninori Morimoto usb_hcd_unlink_urb_from_ep(hcd, urb); 502034d7c13SKuninori Morimoto usb_hcd_giveback_urb(hcd, urb, 0); 503034d7c13SKuninori Morimoto } 504034d7c13SKuninori Morimoto 505034d7c13SKuninori Morimoto static int usbhsh_queue_push(struct usb_hcd *hcd, 506034d7c13SKuninori Morimoto struct usbhs_pipe *pipe, 507ee8a0bf5SKuninori Morimoto struct urb *urb, 508ee8a0bf5SKuninori Morimoto gfp_t mem_flags) 509034d7c13SKuninori Morimoto { 510ee8a0bf5SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_hcd_to_hpriv(hcd); 511034d7c13SKuninori Morimoto struct device *dev = usbhsh_hcd_to_dev(hcd); 512ee8a0bf5SKuninori Morimoto struct usbhsh_request *ureq; 513034d7c13SKuninori Morimoto void *buf; 514034d7c13SKuninori Morimoto int len; 515034d7c13SKuninori Morimoto 516034d7c13SKuninori Morimoto if (usb_pipeisoc(urb->pipe)) { 517034d7c13SKuninori Morimoto dev_err(dev, "pipe iso is not supported now\n"); 518034d7c13SKuninori Morimoto return -EIO; 519034d7c13SKuninori Morimoto } 520034d7c13SKuninori Morimoto 521ee8a0bf5SKuninori Morimoto /* this ureq will be freed on usbhsh_queue_done() */ 522ee8a0bf5SKuninori Morimoto ureq = usbhsh_ureq_alloc(hpriv, urb, mem_flags); 523ee8a0bf5SKuninori Morimoto if (unlikely(!ureq)) { 524ee8a0bf5SKuninori Morimoto dev_err(dev, "ureq alloc fail\n"); 525ee8a0bf5SKuninori Morimoto return -ENOMEM; 526ee8a0bf5SKuninori Morimoto } 527ee8a0bf5SKuninori Morimoto 528034d7c13SKuninori Morimoto if (usb_pipein(urb->pipe)) 529034d7c13SKuninori Morimoto pipe->handler = &usbhs_fifo_pio_pop_handler; 530034d7c13SKuninori Morimoto else 531034d7c13SKuninori Morimoto pipe->handler = &usbhs_fifo_pio_push_handler; 532034d7c13SKuninori Morimoto 533034d7c13SKuninori Morimoto buf = (void *)(urb->transfer_buffer + urb->actual_length); 534034d7c13SKuninori Morimoto len = urb->transfer_buffer_length - urb->actual_length; 535034d7c13SKuninori Morimoto 536034d7c13SKuninori Morimoto dev_dbg(dev, "%s\n", __func__); 537ee8a0bf5SKuninori Morimoto usbhs_pkt_push(pipe, &ureq->pkt, usbhsh_queue_done, 538034d7c13SKuninori Morimoto buf, len, (urb->transfer_flags & URB_ZERO_PACKET)); 539034d7c13SKuninori Morimoto usbhs_pkt_start(pipe); 540034d7c13SKuninori Morimoto 541034d7c13SKuninori Morimoto return 0; 542034d7c13SKuninori Morimoto } 543034d7c13SKuninori Morimoto 544034d7c13SKuninori Morimoto /* 545034d7c13SKuninori Morimoto * DCP setup stage 546034d7c13SKuninori Morimoto */ 547034d7c13SKuninori Morimoto static int usbhsh_is_request_address(struct urb *urb) 548034d7c13SKuninori Morimoto { 54925234b46SKuninori Morimoto struct usb_ctrlrequest *req; 550034d7c13SKuninori Morimoto 55125234b46SKuninori Morimoto req = (struct usb_ctrlrequest *)urb->setup_packet; 552034d7c13SKuninori Morimoto 55325234b46SKuninori Morimoto if ((DeviceOutRequest == req->bRequestType << 8) && 55425234b46SKuninori Morimoto (USB_REQ_SET_ADDRESS == req->bRequest)) 555034d7c13SKuninori Morimoto return 1; 556034d7c13SKuninori Morimoto else 557034d7c13SKuninori Morimoto return 0; 558034d7c13SKuninori Morimoto } 559034d7c13SKuninori Morimoto 560034d7c13SKuninori Morimoto static void usbhsh_setup_stage_packet_push(struct usbhsh_hpriv *hpriv, 561034d7c13SKuninori Morimoto struct urb *urb, 562034d7c13SKuninori Morimoto struct usbhs_pipe *pipe) 563034d7c13SKuninori Morimoto { 564034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 565034d7c13SKuninori Morimoto struct usb_ctrlrequest req; 566034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 567034d7c13SKuninori Morimoto 568034d7c13SKuninori Morimoto /* 569034d7c13SKuninori Morimoto * wait setup packet ACK 570034d7c13SKuninori Morimoto * see 571034d7c13SKuninori Morimoto * usbhsh_irq_setup_ack() 572034d7c13SKuninori Morimoto * usbhsh_irq_setup_err() 573034d7c13SKuninori Morimoto */ 5747fccd480SKuninori Morimoto init_completion(&hpriv->setup_ack_done); 575034d7c13SKuninori Morimoto 576034d7c13SKuninori Morimoto /* copy original request */ 577034d7c13SKuninori Morimoto memcpy(&req, urb->setup_packet, sizeof(struct usb_ctrlrequest)); 578034d7c13SKuninori Morimoto 579034d7c13SKuninori Morimoto /* 580034d7c13SKuninori Morimoto * renesas_usbhs can not use original usb address. 581034d7c13SKuninori Morimoto * see HARDWARE LIMITATION. 582034d7c13SKuninori Morimoto * modify usb address here. 583034d7c13SKuninori Morimoto */ 584034d7c13SKuninori Morimoto if (usbhsh_is_request_address(urb)) { 585034d7c13SKuninori Morimoto /* FIXME */ 586034d7c13SKuninori Morimoto req.wValue = 1; 587034d7c13SKuninori Morimoto dev_dbg(dev, "create new address - %d\n", req.wValue); 588034d7c13SKuninori Morimoto } 589034d7c13SKuninori Morimoto 590034d7c13SKuninori Morimoto /* set request */ 591034d7c13SKuninori Morimoto usbhs_usbreq_set_val(priv, &req); 592034d7c13SKuninori Morimoto 593034d7c13SKuninori Morimoto /* 594034d7c13SKuninori Morimoto * wait setup packet ACK 595034d7c13SKuninori Morimoto */ 5967fccd480SKuninori Morimoto wait_for_completion(&hpriv->setup_ack_done); 597034d7c13SKuninori Morimoto 598034d7c13SKuninori Morimoto dev_dbg(dev, "%s done\n", __func__); 599034d7c13SKuninori Morimoto } 600034d7c13SKuninori Morimoto 601034d7c13SKuninori Morimoto /* 602034d7c13SKuninori Morimoto * DCP data stage 603034d7c13SKuninori Morimoto */ 604034d7c13SKuninori Morimoto static void usbhsh_data_stage_packet_done(struct usbhs_priv *priv, 605034d7c13SKuninori Morimoto struct usbhs_pkt *pkt) 606034d7c13SKuninori Morimoto { 60725234b46SKuninori Morimoto struct usbhsh_request *ureq = usbhsh_pkt_to_ureq(pkt); 608034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 609034d7c13SKuninori Morimoto 610034d7c13SKuninori Morimoto /* this ureq was connected to urb when usbhsh_urb_enqueue() */ 611034d7c13SKuninori Morimoto 61225234b46SKuninori Morimoto usbhsh_ureq_free(hpriv, ureq); 613034d7c13SKuninori Morimoto } 614034d7c13SKuninori Morimoto 615ee8a0bf5SKuninori Morimoto static int usbhsh_data_stage_packet_push(struct usbhsh_hpriv *hpriv, 616034d7c13SKuninori Morimoto struct urb *urb, 617ee8a0bf5SKuninori Morimoto struct usbhs_pipe *pipe, 618ee8a0bf5SKuninori Morimoto gfp_t mem_flags) 619ee8a0bf5SKuninori Morimoto 620034d7c13SKuninori Morimoto { 621034d7c13SKuninori Morimoto struct usbhsh_request *ureq; 622034d7c13SKuninori Morimoto 623ee8a0bf5SKuninori Morimoto /* this ureq will be freed on usbhsh_data_stage_packet_done() */ 624ee8a0bf5SKuninori Morimoto ureq = usbhsh_ureq_alloc(hpriv, urb, mem_flags); 625ee8a0bf5SKuninori Morimoto if (unlikely(!ureq)) 626ee8a0bf5SKuninori Morimoto return -ENOMEM; 627034d7c13SKuninori Morimoto 628034d7c13SKuninori Morimoto if (usb_pipein(urb->pipe)) 629034d7c13SKuninori Morimoto pipe->handler = &usbhs_dcp_data_stage_in_handler; 630034d7c13SKuninori Morimoto else 631034d7c13SKuninori Morimoto pipe->handler = &usbhs_dcp_data_stage_out_handler; 632034d7c13SKuninori Morimoto 633ee8a0bf5SKuninori Morimoto usbhs_pkt_push(pipe, &ureq->pkt, 634034d7c13SKuninori Morimoto usbhsh_data_stage_packet_done, 635034d7c13SKuninori Morimoto urb->transfer_buffer, 636034d7c13SKuninori Morimoto urb->transfer_buffer_length, 637034d7c13SKuninori Morimoto (urb->transfer_flags & URB_ZERO_PACKET)); 638ee8a0bf5SKuninori Morimoto 639ee8a0bf5SKuninori Morimoto return 0; 640034d7c13SKuninori Morimoto } 641034d7c13SKuninori Morimoto 642034d7c13SKuninori Morimoto /* 643034d7c13SKuninori Morimoto * DCP status stage 644034d7c13SKuninori Morimoto */ 645ee8a0bf5SKuninori Morimoto static int usbhsh_status_stage_packet_push(struct usbhsh_hpriv *hpriv, 646034d7c13SKuninori Morimoto struct urb *urb, 647ee8a0bf5SKuninori Morimoto struct usbhs_pipe *pipe, 648ee8a0bf5SKuninori Morimoto gfp_t mem_flags) 649034d7c13SKuninori Morimoto { 650034d7c13SKuninori Morimoto struct usbhsh_request *ureq; 651034d7c13SKuninori Morimoto 652ee8a0bf5SKuninori Morimoto /* This ureq will be freed on usbhsh_queue_done() */ 653ee8a0bf5SKuninori Morimoto ureq = usbhsh_ureq_alloc(hpriv, urb, mem_flags); 654ee8a0bf5SKuninori Morimoto if (unlikely(!ureq)) 655ee8a0bf5SKuninori Morimoto return -ENOMEM; 656034d7c13SKuninori Morimoto 657034d7c13SKuninori Morimoto if (usb_pipein(urb->pipe)) 658034d7c13SKuninori Morimoto pipe->handler = &usbhs_dcp_status_stage_in_handler; 659034d7c13SKuninori Morimoto else 660034d7c13SKuninori Morimoto pipe->handler = &usbhs_dcp_status_stage_out_handler; 661034d7c13SKuninori Morimoto 662ee8a0bf5SKuninori Morimoto usbhs_pkt_push(pipe, &ureq->pkt, 663034d7c13SKuninori Morimoto usbhsh_queue_done, 664034d7c13SKuninori Morimoto NULL, 665034d7c13SKuninori Morimoto urb->transfer_buffer_length, 666034d7c13SKuninori Morimoto 0); 667ee8a0bf5SKuninori Morimoto 668ee8a0bf5SKuninori Morimoto return 0; 669034d7c13SKuninori Morimoto } 670034d7c13SKuninori Morimoto 671034d7c13SKuninori Morimoto static int usbhsh_dcp_queue_push(struct usb_hcd *hcd, 672034d7c13SKuninori Morimoto struct usbhs_pipe *pipe, 673ee8a0bf5SKuninori Morimoto struct urb *urb, 674ee8a0bf5SKuninori Morimoto gfp_t mflags) 675034d7c13SKuninori Morimoto { 676ee8a0bf5SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_hcd_to_hpriv(hcd); 677034d7c13SKuninori Morimoto struct device *dev = usbhsh_hcd_to_dev(hcd); 678ee8a0bf5SKuninori Morimoto int ret; 679034d7c13SKuninori Morimoto 680034d7c13SKuninori Morimoto dev_dbg(dev, "%s\n", __func__); 681034d7c13SKuninori Morimoto 682034d7c13SKuninori Morimoto /* 683034d7c13SKuninori Morimoto * setup stage 684034d7c13SKuninori Morimoto * 685034d7c13SKuninori Morimoto * usbhsh_send_setup_stage_packet() wait SACK/SIGN 686034d7c13SKuninori Morimoto */ 687034d7c13SKuninori Morimoto usbhsh_setup_stage_packet_push(hpriv, urb, pipe); 688034d7c13SKuninori Morimoto 689034d7c13SKuninori Morimoto /* 690034d7c13SKuninori Morimoto * data stage 691034d7c13SKuninori Morimoto * 692034d7c13SKuninori Morimoto * It is pushed only when urb has buffer. 693034d7c13SKuninori Morimoto */ 694ee8a0bf5SKuninori Morimoto if (urb->transfer_buffer_length) { 695ee8a0bf5SKuninori Morimoto ret = usbhsh_data_stage_packet_push(hpriv, urb, pipe, mflags); 696ee8a0bf5SKuninori Morimoto if (ret < 0) { 697ee8a0bf5SKuninori Morimoto dev_err(dev, "data stage failed\n"); 698ee8a0bf5SKuninori Morimoto return ret; 699ee8a0bf5SKuninori Morimoto } 700ee8a0bf5SKuninori Morimoto } 701034d7c13SKuninori Morimoto 702034d7c13SKuninori Morimoto /* 703034d7c13SKuninori Morimoto * status stage 704034d7c13SKuninori Morimoto */ 705ee8a0bf5SKuninori Morimoto ret = usbhsh_status_stage_packet_push(hpriv, urb, pipe, mflags); 706ee8a0bf5SKuninori Morimoto if (ret < 0) { 707ee8a0bf5SKuninori Morimoto dev_err(dev, "status stage failed\n"); 708ee8a0bf5SKuninori Morimoto return ret; 709ee8a0bf5SKuninori Morimoto } 710034d7c13SKuninori Morimoto 711034d7c13SKuninori Morimoto /* 712034d7c13SKuninori Morimoto * start pushed packets 713034d7c13SKuninori Morimoto */ 714034d7c13SKuninori Morimoto usbhs_pkt_start(pipe); 715034d7c13SKuninori Morimoto 716034d7c13SKuninori Morimoto return 0; 717034d7c13SKuninori Morimoto } 718034d7c13SKuninori Morimoto 719034d7c13SKuninori Morimoto /* 720034d7c13SKuninori Morimoto * dma map functions 721034d7c13SKuninori Morimoto */ 722034d7c13SKuninori Morimoto static int usbhsh_dma_map_ctrl(struct usbhs_pkt *pkt, int map) 723034d7c13SKuninori Morimoto { 724034d7c13SKuninori Morimoto return 0; 725034d7c13SKuninori Morimoto } 726034d7c13SKuninori Morimoto 727034d7c13SKuninori Morimoto /* 728034d7c13SKuninori Morimoto * for hc_driver 729034d7c13SKuninori Morimoto */ 730034d7c13SKuninori Morimoto static int usbhsh_host_start(struct usb_hcd *hcd) 731034d7c13SKuninori Morimoto { 732034d7c13SKuninori Morimoto return 0; 733034d7c13SKuninori Morimoto } 734034d7c13SKuninori Morimoto 735034d7c13SKuninori Morimoto static void usbhsh_host_stop(struct usb_hcd *hcd) 736034d7c13SKuninori Morimoto { 737034d7c13SKuninori Morimoto } 738034d7c13SKuninori Morimoto 739034d7c13SKuninori Morimoto static int usbhsh_urb_enqueue(struct usb_hcd *hcd, 740034d7c13SKuninori Morimoto struct urb *urb, 741034d7c13SKuninori Morimoto gfp_t mem_flags) 742034d7c13SKuninori Morimoto { 743034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_hcd_to_hpriv(hcd); 744034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 745034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 746034d7c13SKuninori Morimoto struct usb_device *usbv = usbhsh_urb_to_usbv(urb); 747034d7c13SKuninori Morimoto struct usb_host_endpoint *ep = urb->ep; 748034d7c13SKuninori Morimoto struct usbhsh_device *udev, *new_udev = NULL; 749034d7c13SKuninori Morimoto struct usbhs_pipe *pipe; 750034d7c13SKuninori Morimoto struct usbhsh_ep *uep; 75173ef635aSKuninori Morimoto int is_dir_in = usb_pipein(urb->pipe); 752034d7c13SKuninori Morimoto 753034d7c13SKuninori Morimoto int ret; 754034d7c13SKuninori Morimoto 75573ef635aSKuninori Morimoto dev_dbg(dev, "%s (%s)\n", __func__, is_dir_in ? "in" : "out"); 756034d7c13SKuninori Morimoto 757034d7c13SKuninori Morimoto ret = usb_hcd_link_urb_to_ep(hcd, urb); 758034d7c13SKuninori Morimoto if (ret) 759034d7c13SKuninori Morimoto goto usbhsh_urb_enqueue_error_not_linked; 760034d7c13SKuninori Morimoto 761034d7c13SKuninori Morimoto /* 762034d7c13SKuninori Morimoto * get udev 763034d7c13SKuninori Morimoto */ 764034d7c13SKuninori Morimoto udev = usbhsh_usbv_to_udev(usbv); 765034d7c13SKuninori Morimoto if (!udev) { 766034d7c13SKuninori Morimoto new_udev = usbhsh_device_alloc(hpriv, urb); 767034d7c13SKuninori Morimoto if (!new_udev) 768034d7c13SKuninori Morimoto goto usbhsh_urb_enqueue_error_not_linked; 769034d7c13SKuninori Morimoto 770034d7c13SKuninori Morimoto udev = new_udev; 771034d7c13SKuninori Morimoto } 772034d7c13SKuninori Morimoto 773034d7c13SKuninori Morimoto /* 774034d7c13SKuninori Morimoto * get uep 775034d7c13SKuninori Morimoto */ 776034d7c13SKuninori Morimoto uep = usbhsh_ep_to_uep(ep); 777034d7c13SKuninori Morimoto if (!uep) { 77873ef635aSKuninori Morimoto uep = usbhsh_endpoint_alloc(hpriv, udev, ep, 77973ef635aSKuninori Morimoto is_dir_in, mem_flags); 780034d7c13SKuninori Morimoto if (!uep) 781034d7c13SKuninori Morimoto goto usbhsh_urb_enqueue_error_free_device; 782034d7c13SKuninori Morimoto } 783034d7c13SKuninori Morimoto pipe = usbhsh_uep_to_pipe(uep); 784034d7c13SKuninori Morimoto 785034d7c13SKuninori Morimoto /* 786034d7c13SKuninori Morimoto * push packet 787034d7c13SKuninori Morimoto */ 788034d7c13SKuninori Morimoto if (usb_pipecontrol(urb->pipe)) 789ee8a0bf5SKuninori Morimoto ret = usbhsh_dcp_queue_push(hcd, pipe, urb, mem_flags); 790034d7c13SKuninori Morimoto else 791ee8a0bf5SKuninori Morimoto ret = usbhsh_queue_push(hcd, pipe, urb, mem_flags); 792034d7c13SKuninori Morimoto 793ee8a0bf5SKuninori Morimoto return ret; 794034d7c13SKuninori Morimoto 795034d7c13SKuninori Morimoto usbhsh_urb_enqueue_error_free_device: 796034d7c13SKuninori Morimoto if (new_udev) 797034d7c13SKuninori Morimoto usbhsh_device_free(hpriv, new_udev); 798034d7c13SKuninori Morimoto usbhsh_urb_enqueue_error_not_linked: 799034d7c13SKuninori Morimoto 800034d7c13SKuninori Morimoto dev_dbg(dev, "%s error\n", __func__); 801034d7c13SKuninori Morimoto 802034d7c13SKuninori Morimoto return ret; 803034d7c13SKuninori Morimoto } 804034d7c13SKuninori Morimoto 805034d7c13SKuninori Morimoto static int usbhsh_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) 806034d7c13SKuninori Morimoto { 807034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_hcd_to_hpriv(hcd); 808034d7c13SKuninori Morimoto struct usbhsh_request *ureq = usbhsh_urb_to_ureq(urb); 809034d7c13SKuninori Morimoto 810fc9d5c79SKuninori Morimoto if (ureq) 81125234b46SKuninori Morimoto usbhsh_ureq_free(hpriv, ureq); 812034d7c13SKuninori Morimoto 813034d7c13SKuninori Morimoto return 0; 814034d7c13SKuninori Morimoto } 815034d7c13SKuninori Morimoto 816034d7c13SKuninori Morimoto static void usbhsh_endpoint_disable(struct usb_hcd *hcd, 817034d7c13SKuninori Morimoto struct usb_host_endpoint *ep) 818034d7c13SKuninori Morimoto { 819034d7c13SKuninori Morimoto struct usbhsh_ep *uep = usbhsh_ep_to_uep(ep); 820034d7c13SKuninori Morimoto struct usbhsh_device *udev; 821034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv; 822034d7c13SKuninori Morimoto 823034d7c13SKuninori Morimoto /* 824034d7c13SKuninori Morimoto * this function might be called manytimes by same hcd/ep 825fca8ab7eSKuninori Morimoto * in-endpoint == out-endpoint if ep == dcp. 826034d7c13SKuninori Morimoto */ 827034d7c13SKuninori Morimoto if (!uep) 828034d7c13SKuninori Morimoto return; 829034d7c13SKuninori Morimoto 830034d7c13SKuninori Morimoto udev = usbhsh_uep_to_udev(uep); 831034d7c13SKuninori Morimoto hpriv = usbhsh_hcd_to_hpriv(hcd); 832034d7c13SKuninori Morimoto 833034d7c13SKuninori Morimoto usbhsh_endpoint_free(hpriv, ep); 834034d7c13SKuninori Morimoto 835034d7c13SKuninori Morimoto /* 836034d7c13SKuninori Morimoto * if there is no endpoint, 837034d7c13SKuninori Morimoto * free device 838034d7c13SKuninori Morimoto */ 839034d7c13SKuninori Morimoto if (!usbhsh_device_has_endpoint(udev)) 840034d7c13SKuninori Morimoto usbhsh_device_free(hpriv, udev); 841034d7c13SKuninori Morimoto } 842034d7c13SKuninori Morimoto 843034d7c13SKuninori Morimoto static int usbhsh_hub_status_data(struct usb_hcd *hcd, char *buf) 844034d7c13SKuninori Morimoto { 845034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_hcd_to_hpriv(hcd); 846034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 847034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 848034d7c13SKuninori Morimoto int roothub_id = 1; /* only 1 root hub */ 849034d7c13SKuninori Morimoto 850034d7c13SKuninori Morimoto /* 851034d7c13SKuninori Morimoto * does port stat was changed ? 852034d7c13SKuninori Morimoto * check USB_PORT_STAT_C_xxx << 16 853034d7c13SKuninori Morimoto */ 854034d7c13SKuninori Morimoto if (usbhsh_port_stat_get(hpriv) & 0xFFFF0000) 855034d7c13SKuninori Morimoto *buf = (1 << roothub_id); 856034d7c13SKuninori Morimoto else 857034d7c13SKuninori Morimoto *buf = 0; 858034d7c13SKuninori Morimoto 859034d7c13SKuninori Morimoto dev_dbg(dev, "%s (%02x)\n", __func__, *buf); 860034d7c13SKuninori Morimoto 861034d7c13SKuninori Morimoto return !!(*buf); 862034d7c13SKuninori Morimoto } 863034d7c13SKuninori Morimoto 864034d7c13SKuninori Morimoto static int __usbhsh_hub_hub_feature(struct usbhsh_hpriv *hpriv, 865034d7c13SKuninori Morimoto u16 typeReq, u16 wValue, 866034d7c13SKuninori Morimoto u16 wIndex, char *buf, u16 wLength) 867034d7c13SKuninori Morimoto { 868034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 869034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 870034d7c13SKuninori Morimoto 871034d7c13SKuninori Morimoto switch (wValue) { 872034d7c13SKuninori Morimoto case C_HUB_OVER_CURRENT: 873034d7c13SKuninori Morimoto case C_HUB_LOCAL_POWER: 874034d7c13SKuninori Morimoto dev_dbg(dev, "%s :: C_HUB_xx\n", __func__); 875034d7c13SKuninori Morimoto return 0; 876034d7c13SKuninori Morimoto } 877034d7c13SKuninori Morimoto 878034d7c13SKuninori Morimoto return -EPIPE; 879034d7c13SKuninori Morimoto } 880034d7c13SKuninori Morimoto 881034d7c13SKuninori Morimoto static int __usbhsh_hub_port_feature(struct usbhsh_hpriv *hpriv, 882034d7c13SKuninori Morimoto u16 typeReq, u16 wValue, 883034d7c13SKuninori Morimoto u16 wIndex, char *buf, u16 wLength) 884034d7c13SKuninori Morimoto { 885034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 886034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 887034d7c13SKuninori Morimoto int enable = (typeReq == SetPortFeature); 888034d7c13SKuninori Morimoto int speed, i, timeout = 128; 889034d7c13SKuninori Morimoto int roothub_id = 1; /* only 1 root hub */ 890034d7c13SKuninori Morimoto 891034d7c13SKuninori Morimoto /* common error */ 892034d7c13SKuninori Morimoto if (wIndex > roothub_id || wLength != 0) 893034d7c13SKuninori Morimoto return -EPIPE; 894034d7c13SKuninori Morimoto 895034d7c13SKuninori Morimoto /* check wValue */ 896034d7c13SKuninori Morimoto switch (wValue) { 897034d7c13SKuninori Morimoto case USB_PORT_FEAT_POWER: 898034d7c13SKuninori Morimoto usbhs_vbus_ctrl(priv, enable); 899034d7c13SKuninori Morimoto dev_dbg(dev, "%s :: USB_PORT_FEAT_POWER\n", __func__); 900034d7c13SKuninori Morimoto break; 901034d7c13SKuninori Morimoto 902034d7c13SKuninori Morimoto case USB_PORT_FEAT_ENABLE: 903034d7c13SKuninori Morimoto case USB_PORT_FEAT_SUSPEND: 904034d7c13SKuninori Morimoto case USB_PORT_FEAT_C_ENABLE: 905034d7c13SKuninori Morimoto case USB_PORT_FEAT_C_SUSPEND: 906034d7c13SKuninori Morimoto case USB_PORT_FEAT_C_CONNECTION: 907034d7c13SKuninori Morimoto case USB_PORT_FEAT_C_OVER_CURRENT: 908034d7c13SKuninori Morimoto case USB_PORT_FEAT_C_RESET: 909034d7c13SKuninori Morimoto dev_dbg(dev, "%s :: USB_PORT_FEAT_xxx\n", __func__); 910034d7c13SKuninori Morimoto break; 911034d7c13SKuninori Morimoto 912034d7c13SKuninori Morimoto case USB_PORT_FEAT_RESET: 913034d7c13SKuninori Morimoto if (!enable) 914034d7c13SKuninori Morimoto break; 915034d7c13SKuninori Morimoto 916034d7c13SKuninori Morimoto usbhsh_port_stat_clear(hpriv, 917034d7c13SKuninori Morimoto USB_PORT_STAT_HIGH_SPEED | 918034d7c13SKuninori Morimoto USB_PORT_STAT_LOW_SPEED); 919034d7c13SKuninori Morimoto 920034d7c13SKuninori Morimoto usbhs_bus_send_reset(priv); 921034d7c13SKuninori Morimoto msleep(20); 922034d7c13SKuninori Morimoto usbhs_bus_send_sof_enable(priv); 923034d7c13SKuninori Morimoto 924034d7c13SKuninori Morimoto for (i = 0; i < timeout ; i++) { 925034d7c13SKuninori Morimoto switch (usbhs_bus_get_speed(priv)) { 926034d7c13SKuninori Morimoto case USB_SPEED_LOW: 927034d7c13SKuninori Morimoto speed = USB_PORT_STAT_LOW_SPEED; 928034d7c13SKuninori Morimoto goto got_usb_bus_speed; 929034d7c13SKuninori Morimoto case USB_SPEED_HIGH: 930034d7c13SKuninori Morimoto speed = USB_PORT_STAT_HIGH_SPEED; 931034d7c13SKuninori Morimoto goto got_usb_bus_speed; 932034d7c13SKuninori Morimoto case USB_SPEED_FULL: 933034d7c13SKuninori Morimoto speed = 0; 934034d7c13SKuninori Morimoto goto got_usb_bus_speed; 935034d7c13SKuninori Morimoto } 936034d7c13SKuninori Morimoto 937034d7c13SKuninori Morimoto msleep(20); 938034d7c13SKuninori Morimoto } 939034d7c13SKuninori Morimoto return -EPIPE; 940034d7c13SKuninori Morimoto 941034d7c13SKuninori Morimoto got_usb_bus_speed: 942034d7c13SKuninori Morimoto usbhsh_port_stat_set(hpriv, speed); 943034d7c13SKuninori Morimoto usbhsh_port_stat_set(hpriv, USB_PORT_STAT_ENABLE); 944034d7c13SKuninori Morimoto 945034d7c13SKuninori Morimoto dev_dbg(dev, "%s :: USB_PORT_FEAT_RESET (speed = %d)\n", 946034d7c13SKuninori Morimoto __func__, speed); 947034d7c13SKuninori Morimoto 948034d7c13SKuninori Morimoto /* status change is not needed */ 949034d7c13SKuninori Morimoto return 0; 950034d7c13SKuninori Morimoto 951034d7c13SKuninori Morimoto default: 952034d7c13SKuninori Morimoto return -EPIPE; 953034d7c13SKuninori Morimoto } 954034d7c13SKuninori Morimoto 955034d7c13SKuninori Morimoto /* set/clear status */ 956034d7c13SKuninori Morimoto if (enable) 957034d7c13SKuninori Morimoto usbhsh_port_stat_set(hpriv, (1 << wValue)); 958034d7c13SKuninori Morimoto else 959034d7c13SKuninori Morimoto usbhsh_port_stat_clear(hpriv, (1 << wValue)); 960034d7c13SKuninori Morimoto 961034d7c13SKuninori Morimoto return 0; 962034d7c13SKuninori Morimoto } 963034d7c13SKuninori Morimoto 964034d7c13SKuninori Morimoto static int __usbhsh_hub_get_status(struct usbhsh_hpriv *hpriv, 965034d7c13SKuninori Morimoto u16 typeReq, u16 wValue, 966034d7c13SKuninori Morimoto u16 wIndex, char *buf, u16 wLength) 967034d7c13SKuninori Morimoto { 968034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 969034d7c13SKuninori Morimoto struct usb_hub_descriptor *desc = (struct usb_hub_descriptor *)buf; 970034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 971034d7c13SKuninori Morimoto int roothub_id = 1; /* only 1 root hub */ 972034d7c13SKuninori Morimoto 973034d7c13SKuninori Morimoto switch (typeReq) { 974034d7c13SKuninori Morimoto case GetHubStatus: 975034d7c13SKuninori Morimoto dev_dbg(dev, "%s :: GetHubStatus\n", __func__); 976034d7c13SKuninori Morimoto 977034d7c13SKuninori Morimoto *buf = 0x00; 978034d7c13SKuninori Morimoto break; 979034d7c13SKuninori Morimoto 980034d7c13SKuninori Morimoto case GetPortStatus: 981034d7c13SKuninori Morimoto if (wIndex != roothub_id) 982034d7c13SKuninori Morimoto return -EPIPE; 983034d7c13SKuninori Morimoto 984034d7c13SKuninori Morimoto dev_dbg(dev, "%s :: GetPortStatus\n", __func__); 985034d7c13SKuninori Morimoto *(__le32 *)buf = cpu_to_le32(usbhsh_port_stat_get(hpriv)); 986034d7c13SKuninori Morimoto break; 987034d7c13SKuninori Morimoto 988034d7c13SKuninori Morimoto case GetHubDescriptor: 989034d7c13SKuninori Morimoto desc->bDescriptorType = 0x29; 990034d7c13SKuninori Morimoto desc->bHubContrCurrent = 0; 991034d7c13SKuninori Morimoto desc->bNbrPorts = roothub_id; 992034d7c13SKuninori Morimoto desc->bDescLength = 9; 993034d7c13SKuninori Morimoto desc->bPwrOn2PwrGood = 0; 994034d7c13SKuninori Morimoto desc->wHubCharacteristics = cpu_to_le16(0x0011); 995034d7c13SKuninori Morimoto desc->u.hs.DeviceRemovable[0] = (roothub_id << 1); 996034d7c13SKuninori Morimoto desc->u.hs.DeviceRemovable[1] = ~0; 997034d7c13SKuninori Morimoto dev_dbg(dev, "%s :: GetHubDescriptor\n", __func__); 998034d7c13SKuninori Morimoto break; 999034d7c13SKuninori Morimoto } 1000034d7c13SKuninori Morimoto 1001034d7c13SKuninori Morimoto return 0; 1002034d7c13SKuninori Morimoto } 1003034d7c13SKuninori Morimoto 1004034d7c13SKuninori Morimoto static int usbhsh_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, 1005034d7c13SKuninori Morimoto u16 wIndex, char *buf, u16 wLength) 1006034d7c13SKuninori Morimoto { 1007034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_hcd_to_hpriv(hcd); 1008034d7c13SKuninori Morimoto struct usbhs_priv *priv = usbhsh_hpriv_to_priv(hpriv); 1009034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 1010034d7c13SKuninori Morimoto int ret = -EPIPE; 1011034d7c13SKuninori Morimoto 1012034d7c13SKuninori Morimoto switch (typeReq) { 1013034d7c13SKuninori Morimoto 1014034d7c13SKuninori Morimoto /* Hub Feature */ 1015034d7c13SKuninori Morimoto case ClearHubFeature: 1016034d7c13SKuninori Morimoto case SetHubFeature: 1017034d7c13SKuninori Morimoto ret = __usbhsh_hub_hub_feature(hpriv, typeReq, 1018034d7c13SKuninori Morimoto wValue, wIndex, buf, wLength); 1019034d7c13SKuninori Morimoto break; 1020034d7c13SKuninori Morimoto 1021034d7c13SKuninori Morimoto /* Port Feature */ 1022034d7c13SKuninori Morimoto case SetPortFeature: 1023034d7c13SKuninori Morimoto case ClearPortFeature: 1024034d7c13SKuninori Morimoto ret = __usbhsh_hub_port_feature(hpriv, typeReq, 1025034d7c13SKuninori Morimoto wValue, wIndex, buf, wLength); 1026034d7c13SKuninori Morimoto break; 1027034d7c13SKuninori Morimoto 1028034d7c13SKuninori Morimoto /* Get status */ 1029034d7c13SKuninori Morimoto case GetHubStatus: 1030034d7c13SKuninori Morimoto case GetPortStatus: 1031034d7c13SKuninori Morimoto case GetHubDescriptor: 1032034d7c13SKuninori Morimoto ret = __usbhsh_hub_get_status(hpriv, typeReq, 1033034d7c13SKuninori Morimoto wValue, wIndex, buf, wLength); 1034034d7c13SKuninori Morimoto break; 1035034d7c13SKuninori Morimoto } 1036034d7c13SKuninori Morimoto 1037034d7c13SKuninori Morimoto dev_dbg(dev, "typeReq = %x, ret = %d, port_stat = %x\n", 1038034d7c13SKuninori Morimoto typeReq, ret, usbhsh_port_stat_get(hpriv)); 1039034d7c13SKuninori Morimoto 1040034d7c13SKuninori Morimoto return ret; 1041034d7c13SKuninori Morimoto } 1042034d7c13SKuninori Morimoto 1043034d7c13SKuninori Morimoto static struct hc_driver usbhsh_driver = { 1044034d7c13SKuninori Morimoto .description = usbhsh_hcd_name, 1045034d7c13SKuninori Morimoto .hcd_priv_size = sizeof(struct usbhsh_hpriv), 1046034d7c13SKuninori Morimoto 1047034d7c13SKuninori Morimoto /* 1048034d7c13SKuninori Morimoto * generic hardware linkage 1049034d7c13SKuninori Morimoto */ 1050034d7c13SKuninori Morimoto .flags = HCD_USB2, 1051034d7c13SKuninori Morimoto 1052034d7c13SKuninori Morimoto .start = usbhsh_host_start, 1053034d7c13SKuninori Morimoto .stop = usbhsh_host_stop, 1054034d7c13SKuninori Morimoto 1055034d7c13SKuninori Morimoto /* 1056034d7c13SKuninori Morimoto * managing i/o requests and associated device resources 1057034d7c13SKuninori Morimoto */ 1058034d7c13SKuninori Morimoto .urb_enqueue = usbhsh_urb_enqueue, 1059034d7c13SKuninori Morimoto .urb_dequeue = usbhsh_urb_dequeue, 1060034d7c13SKuninori Morimoto .endpoint_disable = usbhsh_endpoint_disable, 1061034d7c13SKuninori Morimoto 1062034d7c13SKuninori Morimoto /* 1063034d7c13SKuninori Morimoto * root hub 1064034d7c13SKuninori Morimoto */ 1065034d7c13SKuninori Morimoto .hub_status_data = usbhsh_hub_status_data, 1066034d7c13SKuninori Morimoto .hub_control = usbhsh_hub_control, 1067034d7c13SKuninori Morimoto }; 1068034d7c13SKuninori Morimoto 1069034d7c13SKuninori Morimoto /* 1070034d7c13SKuninori Morimoto * interrupt functions 1071034d7c13SKuninori Morimoto */ 1072034d7c13SKuninori Morimoto static int usbhsh_irq_attch(struct usbhs_priv *priv, 1073034d7c13SKuninori Morimoto struct usbhs_irq_state *irq_state) 1074034d7c13SKuninori Morimoto { 1075034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 1076034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 1077034d7c13SKuninori Morimoto 1078034d7c13SKuninori Morimoto dev_dbg(dev, "device attached\n"); 1079034d7c13SKuninori Morimoto 1080034d7c13SKuninori Morimoto usbhsh_port_stat_set(hpriv, USB_PORT_STAT_CONNECTION); 1081034d7c13SKuninori Morimoto usbhsh_port_stat_set(hpriv, USB_PORT_STAT_C_CONNECTION << 16); 1082034d7c13SKuninori Morimoto 1083034d7c13SKuninori Morimoto return 0; 1084034d7c13SKuninori Morimoto } 1085034d7c13SKuninori Morimoto 1086034d7c13SKuninori Morimoto static int usbhsh_irq_dtch(struct usbhs_priv *priv, 1087034d7c13SKuninori Morimoto struct usbhs_irq_state *irq_state) 1088034d7c13SKuninori Morimoto { 1089034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 1090034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 1091034d7c13SKuninori Morimoto 1092034d7c13SKuninori Morimoto dev_dbg(dev, "device detached\n"); 1093034d7c13SKuninori Morimoto 1094034d7c13SKuninori Morimoto usbhsh_port_stat_clear(hpriv, USB_PORT_STAT_CONNECTION); 1095034d7c13SKuninori Morimoto usbhsh_port_stat_set(hpriv, USB_PORT_STAT_C_CONNECTION << 16); 1096034d7c13SKuninori Morimoto 1097034d7c13SKuninori Morimoto return 0; 1098034d7c13SKuninori Morimoto } 1099034d7c13SKuninori Morimoto 1100034d7c13SKuninori Morimoto static int usbhsh_irq_setup_ack(struct usbhs_priv *priv, 1101034d7c13SKuninori Morimoto struct usbhs_irq_state *irq_state) 1102034d7c13SKuninori Morimoto { 1103034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 1104034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 1105034d7c13SKuninori Morimoto 1106034d7c13SKuninori Morimoto dev_dbg(dev, "setup packet OK\n"); 1107034d7c13SKuninori Morimoto 11087fccd480SKuninori Morimoto complete(&hpriv->setup_ack_done); /* see usbhsh_urb_enqueue() */ 1109034d7c13SKuninori Morimoto 1110034d7c13SKuninori Morimoto return 0; 1111034d7c13SKuninori Morimoto } 1112034d7c13SKuninori Morimoto 1113034d7c13SKuninori Morimoto static int usbhsh_irq_setup_err(struct usbhs_priv *priv, 1114034d7c13SKuninori Morimoto struct usbhs_irq_state *irq_state) 1115034d7c13SKuninori Morimoto { 1116034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 1117034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 1118034d7c13SKuninori Morimoto 1119034d7c13SKuninori Morimoto dev_dbg(dev, "setup packet Err\n"); 1120034d7c13SKuninori Morimoto 11217fccd480SKuninori Morimoto complete(&hpriv->setup_ack_done); /* see usbhsh_urb_enqueue() */ 1122034d7c13SKuninori Morimoto 1123034d7c13SKuninori Morimoto return 0; 1124034d7c13SKuninori Morimoto } 1125034d7c13SKuninori Morimoto 1126034d7c13SKuninori Morimoto /* 1127034d7c13SKuninori Morimoto * module start/stop 1128034d7c13SKuninori Morimoto */ 1129034d7c13SKuninori Morimoto static void usbhsh_pipe_init_for_host(struct usbhs_priv *priv) 1130034d7c13SKuninori Morimoto { 1131034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 1132034d7c13SKuninori Morimoto struct usbhsh_pipe_info *pipe_info = hpriv->pipe_info; 1133034d7c13SKuninori Morimoto struct usbhs_pipe *pipe; 1134034d7c13SKuninori Morimoto u32 *pipe_type = usbhs_get_dparam(priv, pipe_type); 1135034d7c13SKuninori Morimoto int pipe_size = usbhs_get_dparam(priv, pipe_size); 1136034d7c13SKuninori Morimoto int old_type, dir_in, i; 1137034d7c13SKuninori Morimoto 1138034d7c13SKuninori Morimoto /* init all pipe */ 1139034d7c13SKuninori Morimoto old_type = USB_ENDPOINT_XFER_CONTROL; 1140034d7c13SKuninori Morimoto for (i = 0; i < pipe_size; i++) { 1141034d7c13SKuninori Morimoto pipe_info[i].usr_cnt = 0; 1142034d7c13SKuninori Morimoto 1143034d7c13SKuninori Morimoto /* 1144034d7c13SKuninori Morimoto * data "output" will be finished as soon as possible, 1145034d7c13SKuninori Morimoto * but there is no guaranty at data "input" case. 1146034d7c13SKuninori Morimoto * 1147034d7c13SKuninori Morimoto * "input" needs "standby" pipe. 1148034d7c13SKuninori Morimoto * So, "input" direction pipe > "output" direction pipe 1149034d7c13SKuninori Morimoto * is good idea. 1150034d7c13SKuninori Morimoto * 1151034d7c13SKuninori Morimoto * 1st USB_ENDPOINT_XFER_xxx will be output direction, 1152034d7c13SKuninori Morimoto * and the other will be input direction here. 1153034d7c13SKuninori Morimoto * 1154034d7c13SKuninori Morimoto * ex) 1155034d7c13SKuninori Morimoto * ... 1156034d7c13SKuninori Morimoto * USB_ENDPOINT_XFER_ISOC -> dir out 1157034d7c13SKuninori Morimoto * USB_ENDPOINT_XFER_ISOC -> dir in 1158034d7c13SKuninori Morimoto * USB_ENDPOINT_XFER_BULK -> dir out 1159034d7c13SKuninori Morimoto * USB_ENDPOINT_XFER_BULK -> dir in 1160034d7c13SKuninori Morimoto * USB_ENDPOINT_XFER_BULK -> dir in 1161034d7c13SKuninori Morimoto * ... 1162034d7c13SKuninori Morimoto */ 1163034d7c13SKuninori Morimoto dir_in = (pipe_type[i] == old_type); 1164034d7c13SKuninori Morimoto old_type = pipe_type[i]; 1165034d7c13SKuninori Morimoto 1166034d7c13SKuninori Morimoto if (USB_ENDPOINT_XFER_CONTROL == pipe_type[i]) { 1167034d7c13SKuninori Morimoto pipe = usbhs_dcp_malloc(priv); 1168034d7c13SKuninori Morimoto usbhsh_hpriv_to_dcp(hpriv) = pipe; 1169034d7c13SKuninori Morimoto } else { 1170034d7c13SKuninori Morimoto pipe = usbhs_pipe_malloc(priv, 1171034d7c13SKuninori Morimoto pipe_type[i], 1172034d7c13SKuninori Morimoto dir_in); 1173034d7c13SKuninori Morimoto } 1174034d7c13SKuninori Morimoto 1175034d7c13SKuninori Morimoto pipe->mod_private = pipe_info + i; 1176034d7c13SKuninori Morimoto } 1177034d7c13SKuninori Morimoto } 1178034d7c13SKuninori Morimoto 1179034d7c13SKuninori Morimoto static int usbhsh_start(struct usbhs_priv *priv) 1180034d7c13SKuninori Morimoto { 1181034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 1182034d7c13SKuninori Morimoto struct usb_hcd *hcd = usbhsh_hpriv_to_hcd(hpriv); 1183034d7c13SKuninori Morimoto struct usbhs_mod *mod = usbhs_mod_get_current(priv); 1184034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 1185034d7c13SKuninori Morimoto int ret; 1186034d7c13SKuninori Morimoto 1187034d7c13SKuninori Morimoto /* add hcd */ 1188034d7c13SKuninori Morimoto ret = usb_add_hcd(hcd, 0, 0); 1189034d7c13SKuninori Morimoto if (ret < 0) 1190034d7c13SKuninori Morimoto return 0; 1191034d7c13SKuninori Morimoto 1192034d7c13SKuninori Morimoto /* 1193034d7c13SKuninori Morimoto * pipe initialize and enable DCP 1194034d7c13SKuninori Morimoto */ 1195034d7c13SKuninori Morimoto usbhs_pipe_init(priv, 1196034d7c13SKuninori Morimoto usbhsh_dma_map_ctrl); 1197034d7c13SKuninori Morimoto usbhs_fifo_init(priv); 1198034d7c13SKuninori Morimoto usbhsh_pipe_init_for_host(priv); 1199034d7c13SKuninori Morimoto 1200034d7c13SKuninori Morimoto /* 1201034d7c13SKuninori Morimoto * system config enble 1202034d7c13SKuninori Morimoto * - HI speed 1203034d7c13SKuninori Morimoto * - host 1204034d7c13SKuninori Morimoto * - usb module 1205034d7c13SKuninori Morimoto */ 1206034d7c13SKuninori Morimoto usbhs_sys_host_ctrl(priv, 1); 1207034d7c13SKuninori Morimoto 1208034d7c13SKuninori Morimoto /* 1209034d7c13SKuninori Morimoto * enable irq callback 1210034d7c13SKuninori Morimoto */ 1211034d7c13SKuninori Morimoto mod->irq_attch = usbhsh_irq_attch; 1212034d7c13SKuninori Morimoto mod->irq_dtch = usbhsh_irq_dtch; 1213034d7c13SKuninori Morimoto mod->irq_sack = usbhsh_irq_setup_ack; 1214034d7c13SKuninori Morimoto mod->irq_sign = usbhsh_irq_setup_err; 1215034d7c13SKuninori Morimoto usbhs_irq_callback_update(priv, mod); 1216034d7c13SKuninori Morimoto 1217034d7c13SKuninori Morimoto dev_dbg(dev, "start host\n"); 1218034d7c13SKuninori Morimoto 1219034d7c13SKuninori Morimoto return ret; 1220034d7c13SKuninori Morimoto } 1221034d7c13SKuninori Morimoto 1222034d7c13SKuninori Morimoto static int usbhsh_stop(struct usbhs_priv *priv) 1223034d7c13SKuninori Morimoto { 1224034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 1225034d7c13SKuninori Morimoto struct usb_hcd *hcd = usbhsh_hpriv_to_hcd(hpriv); 1226146ee50aSKuninori Morimoto struct usbhs_mod *mod = usbhs_mod_get_current(priv); 1227034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 1228034d7c13SKuninori Morimoto 1229146ee50aSKuninori Morimoto /* 1230146ee50aSKuninori Morimoto * disable irq callback 1231146ee50aSKuninori Morimoto */ 1232146ee50aSKuninori Morimoto mod->irq_attch = NULL; 1233146ee50aSKuninori Morimoto mod->irq_dtch = NULL; 1234146ee50aSKuninori Morimoto mod->irq_sack = NULL; 1235146ee50aSKuninori Morimoto mod->irq_sign = NULL; 1236146ee50aSKuninori Morimoto usbhs_irq_callback_update(priv, mod); 1237146ee50aSKuninori Morimoto 1238034d7c13SKuninori Morimoto usb_remove_hcd(hcd); 1239034d7c13SKuninori Morimoto 1240034d7c13SKuninori Morimoto /* disable sys */ 1241034d7c13SKuninori Morimoto usbhs_sys_host_ctrl(priv, 0); 1242034d7c13SKuninori Morimoto 1243034d7c13SKuninori Morimoto dev_dbg(dev, "quit host\n"); 1244034d7c13SKuninori Morimoto 1245034d7c13SKuninori Morimoto return 0; 1246034d7c13SKuninori Morimoto } 1247034d7c13SKuninori Morimoto 1248b7a8d17dSKuninori Morimoto int usbhs_mod_host_probe(struct usbhs_priv *priv) 1249034d7c13SKuninori Morimoto { 1250034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv; 1251034d7c13SKuninori Morimoto struct usb_hcd *hcd; 1252034d7c13SKuninori Morimoto struct usbhsh_pipe_info *pipe_info; 1253034d7c13SKuninori Morimoto struct usbhsh_device *udev; 1254034d7c13SKuninori Morimoto struct device *dev = usbhs_priv_to_dev(priv); 1255034d7c13SKuninori Morimoto int pipe_size = usbhs_get_dparam(priv, pipe_size); 1256034d7c13SKuninori Morimoto int i; 1257034d7c13SKuninori Morimoto 1258034d7c13SKuninori Morimoto /* initialize hcd */ 1259034d7c13SKuninori Morimoto hcd = usb_create_hcd(&usbhsh_driver, dev, usbhsh_hcd_name); 1260034d7c13SKuninori Morimoto if (!hcd) { 1261034d7c13SKuninori Morimoto dev_err(dev, "Failed to create hcd\n"); 1262034d7c13SKuninori Morimoto return -ENOMEM; 1263034d7c13SKuninori Morimoto } 1264034d7c13SKuninori Morimoto 1265034d7c13SKuninori Morimoto pipe_info = kzalloc(sizeof(*pipe_info) * pipe_size, GFP_KERNEL); 1266034d7c13SKuninori Morimoto if (!pipe_info) { 1267034d7c13SKuninori Morimoto dev_err(dev, "Could not allocate pipe_info\n"); 1268034d7c13SKuninori Morimoto goto usbhs_mod_host_probe_err; 1269034d7c13SKuninori Morimoto } 1270034d7c13SKuninori Morimoto 1271034d7c13SKuninori Morimoto /* 1272034d7c13SKuninori Morimoto * CAUTION 1273034d7c13SKuninori Morimoto * 1274034d7c13SKuninori Morimoto * There is no guarantee that it is possible to access usb module here. 1275034d7c13SKuninori Morimoto * Don't accesses to it. 1276034d7c13SKuninori Morimoto * The accesse will be enable after "usbhsh_start" 1277034d7c13SKuninori Morimoto */ 1278034d7c13SKuninori Morimoto 1279034d7c13SKuninori Morimoto hpriv = usbhsh_hcd_to_hpriv(hcd); 1280034d7c13SKuninori Morimoto 1281034d7c13SKuninori Morimoto /* 1282034d7c13SKuninori Morimoto * register itself 1283034d7c13SKuninori Morimoto */ 1284034d7c13SKuninori Morimoto usbhs_mod_register(priv, &hpriv->mod, USBHS_HOST); 1285034d7c13SKuninori Morimoto 1286034d7c13SKuninori Morimoto /* init hpriv */ 1287034d7c13SKuninori Morimoto hpriv->mod.name = "host"; 1288034d7c13SKuninori Morimoto hpriv->mod.start = usbhsh_start; 1289034d7c13SKuninori Morimoto hpriv->mod.stop = usbhsh_stop; 1290034d7c13SKuninori Morimoto hpriv->pipe_info = pipe_info; 1291034d7c13SKuninori Morimoto hpriv->pipe_size = pipe_size; 1292034d7c13SKuninori Morimoto usbhsh_port_stat_init(hpriv); 1293034d7c13SKuninori Morimoto 1294034d7c13SKuninori Morimoto /* init all device */ 1295034d7c13SKuninori Morimoto usbhsh_for_each_udev_with_dev0(udev, hpriv, i) { 1296034d7c13SKuninori Morimoto udev->usbv = NULL; 1297034d7c13SKuninori Morimoto INIT_LIST_HEAD(&udev->ep_list_head); 1298034d7c13SKuninori Morimoto } 1299034d7c13SKuninori Morimoto 1300034d7c13SKuninori Morimoto dev_info(dev, "host probed\n"); 1301034d7c13SKuninori Morimoto 1302034d7c13SKuninori Morimoto return 0; 1303034d7c13SKuninori Morimoto 1304034d7c13SKuninori Morimoto usbhs_mod_host_probe_err: 1305034d7c13SKuninori Morimoto usb_put_hcd(hcd); 1306034d7c13SKuninori Morimoto 1307034d7c13SKuninori Morimoto return -ENOMEM; 1308034d7c13SKuninori Morimoto } 1309034d7c13SKuninori Morimoto 1310b7a8d17dSKuninori Morimoto int usbhs_mod_host_remove(struct usbhs_priv *priv) 1311034d7c13SKuninori Morimoto { 1312034d7c13SKuninori Morimoto struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); 1313034d7c13SKuninori Morimoto struct usb_hcd *hcd = usbhsh_hpriv_to_hcd(hpriv); 1314034d7c13SKuninori Morimoto 1315034d7c13SKuninori Morimoto usb_put_hcd(hcd); 1316034d7c13SKuninori Morimoto 1317034d7c13SKuninori Morimoto return 0; 1318034d7c13SKuninori Morimoto } 1319