components/libusb-1/patches/01-libusb.patch
author Vladimir Marek <Vladimir.Marek@oracle.com>
Tue, 19 Jul 2016 15:32:04 +0200
branchs11u3-sru
changeset 6459 535eb53d63d5
parent 6359 f969c4942506
permissions -rw-r--r--
23856628 problem in UTILITY/PERL
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6359
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
     1
Solaris support for libusb 1.0, see upstream bug https://github.com/libusb/libusb/issues/169
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
     2
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
     3
diff -Naur libusb-1.0.20/configure.ac libusb-1.0.20.new/configure.ac
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
     4
--- libusb-1.0.20/configure.ac	2015-09-05 10:20:40.000000000 -0700
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
     5
+++ libusb-1.0.20.new/configure.ac	2016-03-10 00:35:25.712129055 -0800
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
     6
@@ -95,6 +95,12 @@
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
     7
 	backend="haiku"
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
     8
 	threads="posix"
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
     9
 	;;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    10
+*-solaris*)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    11
+	AC_MSG_RESULT([SunOS])
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    12
+	backend="sunos"
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    13
+	threads="posix"
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    14
+	;;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    15
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    16
 *)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    17
 	AC_MSG_ERROR([unsupported operating system])
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    18
 esac
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    19
@@ -157,6 +163,16 @@
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    20
 	AC_CHECK_HEADERS([poll.h])
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    21
 	AC_DEFINE([POLL_NFDS_TYPE],[nfds_t],[type of second poll() argument])
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    22
 	;;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    23
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    24
+sunos)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    25
+	AC_DEFINE(OS_SUNOS, 1, [SunOS backend])
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    26
+	AC_SUBST(OS_SUNOS)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    27
+	THREAD_CFLAGS="-pthread"
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    28
+	LIBS="-pthread -ldevinfo"
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    29
+	AC_CHECK_HEADERS([poll.h])
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    30
+	AC_DEFINE([POLL_NFDS_TYPE],[nfds_t],[type of second poll() argument])
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    31
+	;;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    32
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    33
 netbsd)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    34
 	AC_DEFINE(OS_NETBSD, 1, [NetBSD backend])
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    35
 	AC_SUBST(OS_NETBSD)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    36
@@ -187,6 +203,7 @@
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    37
 AM_CONDITIONAL(OS_LINUX, test "x$backend" = xlinux)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    38
 AM_CONDITIONAL(OS_DARWIN, test "x$backend" = xdarwin)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    39
 AM_CONDITIONAL(OS_OPENBSD, test "x$backend" = xopenbsd)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    40
+AM_CONDITIONAL(OS_SUNOS, test "x$backend" = xsunos)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    41
 AM_CONDITIONAL(OS_NETBSD, test "x$backend" = xnetbsd)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    42
 AM_CONDITIONAL(OS_WINDOWS, test "x$backend" = xwindows)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    43
 AM_CONDITIONAL(OS_HAIKU, test "x$backend" = xhaiku)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    44
diff -Naur libusb-1.0.20/libusb/Makefile.am libusb-1.0.20.new/libusb/Makefile.am
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    45
--- libusb-1.0.20/libusb/Makefile.am	2015-09-05 10:20:40.000000000 -0700
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    46
+++ libusb-1.0.20.new/libusb/Makefile.am	2016-03-10 00:19:22.549380102 -0800
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    47
@@ -9,6 +9,7 @@
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    48
 DARWIN_USB_SRC = os/darwin_usb.c
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    49
 OPENBSD_USB_SRC = os/openbsd_usb.c
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    50
 NETBSD_USB_SRC = os/netbsd_usb.c
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    51
+SUNOS_USB_SRC = os/sunos_usb.c os/sunos_usb.h
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    52
 WINDOWS_USB_SRC = os/poll_windows.c os/windows_usb.c libusb-1.0.rc libusb-1.0.def
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    53
 WINCE_USB_SRC = os/wince_usb.c os/wince_usb.h
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    54
 
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    55
@@ -49,6 +50,10 @@
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    56
 OS_SRC = $(NETBSD_USB_SRC) $(POSIX_POLL_SRC)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    57
 endif
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    58
 
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    59
+if OS_SUNOS
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    60
+OS_SRC = $(SUNOS_USB_SRC) $(POSIX_POLL_SRC)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    61
+endif
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    62
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    63
 if OS_HAIKU
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    64
 OS_SRC = $(POSIX_POLL_SRC)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    65
 SUBDIRS = os/haiku
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    66
diff -Naur libusb-1.0.20/libusb/core.c libusb-1.0.20.new/libusb/core.c
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    67
--- libusb-1.0.20/libusb/core.c	2015-09-05 10:30:43.000000000 -0700
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    68
+++ libusb-1.0.20.new/libusb/core.c	2016-03-10 00:20:40.154945235 -0800
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    69
@@ -58,6 +58,8 @@
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    70
 const struct usbi_os_backend * const usbi_backend = &wince_backend;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    71
 #elif defined(OS_HAIKU)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    72
 const struct usbi_os_backend * const usbi_backend = &haiku_usb_raw_backend;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    73
+#elif defined(OS_SUNOS)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    74
+const struct usbi_os_backend * const usbi_backend = &sunos_backend;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    75
 #else
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    76
 #error "Unsupported OS"
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    77
 #endif
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    78
diff -Naur libusb-1.0.20/libusb/libusbi.h libusb-1.0.20.new/libusb/libusbi.h
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    79
--- libusb-1.0.20/libusb/libusbi.h	2015-09-13 17:36:19.000000000 -0700
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    80
+++ libusb-1.0.20.new/libusb/libusbi.h	2016-03-10 00:23:08.647355689 -0800
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    81
@@ -493,7 +493,8 @@
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    82
 int usbi_clear_event(struct libusb_context *ctx);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    83
 
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    84
 /* Internal abstraction for poll (needs struct usbi_transfer on Windows) */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    85
-#if defined(OS_LINUX) || defined(OS_DARWIN) || defined(OS_OPENBSD) || defined(OS_NETBSD) || defined(OS_HAIKU)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    86
+#if defined(OS_LINUX) || defined(OS_DARWIN) || defined(OS_OPENBSD) || defined(OS_NETBSD) || \
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    87
+	defined(OS_HAIKU) || defined(OS_SUNOS)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    88
 #include <unistd.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    89
 #include "os/poll_posix.h"
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    90
 #elif defined(OS_WINDOWS) || defined(OS_WINCE)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    91
@@ -1091,6 +1092,7 @@
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    92
 extern const struct usbi_os_backend windows_backend;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    93
 extern const struct usbi_os_backend wince_backend;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    94
 extern const struct usbi_os_backend haiku_usb_raw_backend;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    95
+extern const struct usbi_os_backend sunos_backend;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    96
 
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    97
 extern struct list_head active_contexts_list;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    98
 extern usbi_mutex_static_t active_contexts_lock;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
    99
diff -Naur libusb-1.0.20/libusb/os/sunos_usb.c libusb-1.0.20.new/libusb/os/sunos_usb.c
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   100
--- libusb-1.0.20/libusb/os/sunos_usb.c	1969-12-31 16:00:00.000000000 -0800
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   101
+++ libusb-1.0.20.new/libusb/os/sunos_usb.c	2016-03-10 00:24:36.641449583 -0800
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   102
@@ -0,0 +1,1259 @@
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   103
+/*
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   104
+ *
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   105
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   106
+ *
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   107
+ * This library is free software; you can redistribute it and/or
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   108
+ * modify it under the terms of the GNU Lesser General Public
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   109
+ * License as published by the Free Software Foundation; either
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   110
+ * version 2.1 of the License, or (at your option) any later version.
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   111
+ *
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   112
+ * This library is distributed in the hope that it will be useful,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   113
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   114
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   115
+ * Lesser General Public License for more details.
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   116
+ *
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   117
+ * You should have received a copy of the GNU Lesser General Public
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   118
+ * License along with this library; if not, write to the Free Software
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   119
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   120
+ */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   121
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   122
+#include <config.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   123
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   124
+#include <sys/time.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   125
+#include <sys/types.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   126
+#include <sys/stat.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   127
+#include <strings.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   128
+#include <errno.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   129
+#include <fcntl.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   130
+#include <stdio.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   131
+#include <stdlib.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   132
+#include <string.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   133
+#include <unistd.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   134
+#include <aio.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   135
+#include <libdevinfo.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   136
+#include <sys/usb/clients/ugen/usb_ugen.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   137
+#include <sys/usb/usba.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   138
+#include <sys/pci.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   139
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   140
+#include "libusbi.h"
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   141
+#include "sunos_usb.h"
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   142
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   143
+/*
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   144
+ * Backend functions
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   145
+ */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   146
+static int sunos_init(struct libusb_context *);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   147
+static void sunos_exit(void);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   148
+static int sunos_get_device_list(struct libusb_context *,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   149
+    struct discovered_devs **);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   150
+static int sunos_open(struct libusb_device_handle *);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   151
+static void sunos_close(struct libusb_device_handle *);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   152
+static int sunos_get_device_descriptor(struct libusb_device *,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   153
+    uint8_t*, int *);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   154
+static int sunos_get_active_config_descriptor(struct libusb_device *,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   155
+    uint8_t*, size_t, int *);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   156
+static int sunos_get_config_descriptor(struct libusb_device *, uint8_t,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   157
+    uint8_t*, size_t, int *);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   158
+static int sunos_get_configuration(struct libusb_device_handle *, int *);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   159
+static int sunos_set_configuration(struct libusb_device_handle *, int);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   160
+static int sunos_claim_interface(struct libusb_device_handle *, int);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   161
+static int sunos_release_interface(struct libusb_device_handle *, int);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   162
+static int sunos_set_interface_altsetting(struct libusb_device_handle *,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   163
+    int, int);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   164
+static int sunos_clear_halt(struct libusb_device_handle *, uint8_t);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   165
+static int sunos_reset_device(struct libusb_device_handle *);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   166
+static void sunos_destroy_device(struct libusb_device *);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   167
+static int sunos_submit_transfer(struct usbi_transfer *);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   168
+static int sunos_cancel_transfer(struct usbi_transfer *);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   169
+static void sunos_clear_transfer_priv(struct usbi_transfer *);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   170
+static int sunos_handle_transfer_completion(struct usbi_transfer *);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   171
+static int sunos_clock_gettime(int, struct timespec *);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   172
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   173
+/*
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   174
+ * Private functions
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   175
+ */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   176
+static int _errno_to_libusb(int);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   177
+static int sunos_usb_get_status(int fd);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   178
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   179
+static int sunos_init(struct libusb_context *ctx)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   180
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   181
+	return (LIBUSB_SUCCESS);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   182
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   183
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   184
+static void sunos_exit(void)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   185
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   186
+	usbi_dbg("");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   187
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   188
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   189
+static int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   190
+sunos_fill_in_dev_info(di_node_t node, struct libusb_device *dev)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   191
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   192
+	int	proplen;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   193
+	int	n, *addr, *port_prop;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   194
+	char	*phypath;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   195
+	uint8_t	*rdata;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   196
+	struct libusb_device_descriptor	*descr;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   197
+	sunos_dev_priv_t	*dpriv = (sunos_dev_priv_t *)dev->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   198
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   199
+	/* Device descriptors */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   200
+	proplen = di_prop_lookup_bytes(DDI_DEV_T_ANY, node,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   201
+	    "usb-dev-descriptor", &rdata);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   202
+	if (proplen <= 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   203
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   204
+		return (LIBUSB_ERROR_IO);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   205
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   206
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   207
+	descr = (struct libusb_device_descriptor *)rdata;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   208
+	bcopy(descr, &dpriv->dev_descr, LIBUSB_DT_DEVICE_SIZE);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   209
+	dpriv->dev_descr.bcdUSB = libusb_cpu_to_le16(descr->bcdUSB);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   210
+	dpriv->dev_descr.idVendor = libusb_cpu_to_le16(descr->idVendor);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   211
+	dpriv->dev_descr.idProduct = libusb_cpu_to_le16(descr->idProduct);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   212
+	dpriv->dev_descr.bcdDevice = libusb_cpu_to_le16(descr->bcdDevice);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   213
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   214
+	/* Raw configuration descriptors */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   215
+	proplen = di_prop_lookup_bytes(DDI_DEV_T_ANY, node,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   216
+	    "usb-raw-cfg-descriptors", &rdata);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   217
+	if (proplen <= 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   218
+		usbi_dbg("can't find raw config descriptors");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   219
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   220
+		return (LIBUSB_ERROR_IO);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   221
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   222
+	dpriv->raw_cfgdescr = calloc(1, proplen);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   223
+	if (dpriv->raw_cfgdescr == NULL) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   224
+		return (LIBUSB_ERROR_NO_MEM);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   225
+	} else {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   226
+		bcopy(rdata, dpriv->raw_cfgdescr, proplen);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   227
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   228
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   229
+	n = di_prop_lookup_ints(DDI_DEV_T_ANY, node, "reg", &port_prop);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   230
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   231
+	if ((n != 1) || (*port_prop <= 0)) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   232
+		return (LIBUSB_ERROR_IO);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   233
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   234
+	dev->port_number = *port_prop;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   235
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   236
+	/* device physical path */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   237
+	phypath = di_devfs_path(node);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   238
+	if (phypath) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   239
+		dpriv->phypath = strdup(phypath);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   240
+		di_devfs_path_free(phypath);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   241
+	} else {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   242
+		free(dpriv->raw_cfgdescr);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   243
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   244
+		return (LIBUSB_ERROR_IO);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   245
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   246
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   247
+	/* address */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   248
+	n = di_prop_lookup_ints(DDI_DEV_T_ANY, node, "assigned-address", &addr);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   249
+	if (n != 1 || *addr == 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   250
+		usbi_dbg("can't get address");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   251
+	} else {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   252
+		dev->device_address = *addr;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   253
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   254
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   255
+	/* speed */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   256
+	if (di_prop_exists(DDI_DEV_T_ANY, node, "low-speed") == 1) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   257
+		dev->speed = LIBUSB_SPEED_LOW;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   258
+	} else if (di_prop_exists(DDI_DEV_T_ANY, node, "high-speed") == 1) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   259
+		dev->speed = LIBUSB_SPEED_HIGH;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   260
+	} else if (di_prop_exists(DDI_DEV_T_ANY, node, "full-speed") == 1) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   261
+		dev->speed = LIBUSB_SPEED_FULL;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   262
+	} else if (di_prop_exists(DDI_DEV_T_ANY, node, "super-speed") == 1) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   263
+		dev->speed = LIBUSB_SPEED_SUPER;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   264
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   265
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   266
+	usbi_dbg("vid=%x pid=%x, path=%s, bus_nmber=0x%x, port_number=%d, "
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   267
+	    "speed=%d", dpriv->dev_descr.idVendor, dpriv->dev_descr.idProduct,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   268
+	    dpriv->phypath, dev->bus_number, dev->port_number, dev->speed);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   269
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   270
+	return (LIBUSB_SUCCESS);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   271
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   272
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   273
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   274
+static int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   275
+sunos_add_devices(di_devlink_t link, void *arg)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   276
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   277
+	struct devlink_cbarg	*largs = (struct devlink_cbarg *)arg;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   278
+	struct node_args	*nargs;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   279
+	di_node_t		myself, pnode;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   280
+	uint64_t		session_id = 0;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   281
+	uint16_t		bdf = 0;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   282
+	struct libusb_device	*dev;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   283
+	sunos_dev_priv_t	*devpriv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   284
+	const char		*path, *newpath;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   285
+	int			 n, i;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   286
+	int			*addr_prop;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   287
+	uint8_t			bus_number = 0;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   288
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   289
+	nargs = (struct node_args *)largs->nargs;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   290
+	myself = largs->myself;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   291
+	if (nargs->last_ugenpath) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   292
+		/* the same node's links */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   293
+		return (DI_WALK_CONTINUE);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   294
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   295
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   296
+	/*
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   297
+	 * Construct session ID.
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   298
+	 * session ID = ...parent hub addr|hub addr|dev addr.
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   299
+	 */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   300
+	pnode = myself;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   301
+	i = 0;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   302
+	while (pnode != DI_NODE_NIL) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   303
+		if (di_prop_exists(DDI_DEV_T_ANY, pnode, "root-hub") == 1) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   304
+			/* walk to root */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   305
+			uint32_t *regbuf = NULL;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   306
+			uint32_t reg;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   307
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   308
+			n = di_prop_lookup_ints(DDI_DEV_T_ANY, pnode, "reg",
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   309
+			    (int **)&regbuf);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   310
+			reg = regbuf[0];
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   311
+			bdf = (PCI_REG_BUS_G(reg) << 8) |
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   312
+			    (PCI_REG_DEV_G(reg) << 3) | PCI_REG_FUNC_G(reg);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   313
+			session_id |= (bdf << i * 8);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   314
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   315
+			/* same as 'unit-address' property */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   316
+			bus_number =
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   317
+			    (PCI_REG_DEV_G(reg) << 3) | PCI_REG_FUNC_G(reg);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   318
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   319
+			usbi_dbg("device bus address=%s:%x",
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   320
+			    di_bus_addr(pnode), bus_number);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   321
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   322
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   323
+		}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   324
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   325
+		/* usb_addr */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   326
+		n = di_prop_lookup_ints(DDI_DEV_T_ANY, pnode,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   327
+		    "assigned-address", &addr_prop);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   328
+		if ((n != 1) || (addr_prop[0] == 0)) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   329
+			usbi_dbg("cannot get valid usb_addr");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   330
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   331
+			return (DI_WALK_CONTINUE);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   332
+		}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   333
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   334
+		session_id |= ((addr_prop[0] & 0xff) << i * 8);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   335
+		if (++i > 7)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   336
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   337
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   338
+		pnode = di_parent_node(pnode);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   339
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   340
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   341
+	path = di_devlink_path(link);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   342
+	dev = usbi_get_device_by_session_id(nargs->ctx, session_id);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   343
+	if (dev == NULL) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   344
+		dev = usbi_alloc_device(nargs->ctx, session_id);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   345
+		if (dev == NULL) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   346
+			usbi_dbg("can't alloc device");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   347
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   348
+			return (DI_WALK_TERMINATE);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   349
+		}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   350
+		devpriv = (sunos_dev_priv_t *)dev->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   351
+		if ((newpath = strrchr(path, '/')) == NULL) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   352
+			libusb_unref_device(dev);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   353
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   354
+			return (DI_WALK_TERMINATE);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   355
+		}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   356
+		devpriv->ugenpath = strndup(path, strlen(path) -
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   357
+		    strlen(newpath));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   358
+		dev->bus_number = bus_number;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   359
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   360
+		if (sunos_fill_in_dev_info(myself, dev) != LIBUSB_SUCCESS) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   361
+			libusb_unref_device(dev);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   362
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   363
+			return (DI_WALK_TERMINATE);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   364
+		}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   365
+		if (usbi_sanitize_device(dev) < 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   366
+			libusb_unref_device(dev);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   367
+			usbi_dbg("sanatize failed: ");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   368
+			return (DI_WALK_TERMINATE);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   369
+		}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   370
+	} else {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   371
+		usbi_dbg("Dev %s exists", path);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   372
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   373
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   374
+	devpriv = (sunos_dev_priv_t *)dev->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   375
+	if (nargs->last_ugenpath == NULL) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   376
+		/* first device */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   377
+		nargs->last_ugenpath = devpriv->ugenpath;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   378
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   379
+		if (discovered_devs_append(*(nargs->discdevs), dev) == NULL) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   380
+			usbi_dbg("cannot append device");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   381
+		}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   382
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   383
+		/*
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   384
+		 * we alloc and hence ref this dev. We don't need to ref it
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   385
+		 * hereafter. Front end or app should take care of their ref.
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   386
+		 */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   387
+		libusb_unref_device(dev);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   388
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   389
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   390
+	usbi_dbg("Device %s %s id=0x%llx, devcount:%d, bdf=%x",
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   391
+	    devpriv->ugenpath, path, (uint64_t)session_id,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   392
+	    (*nargs->discdevs)->len, bdf);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   393
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   394
+	return (DI_WALK_CONTINUE);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   395
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   396
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   397
+static int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   398
+sunos_walk_minor_node_link(di_node_t node, void *args)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   399
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   400
+        di_minor_t minor = DI_MINOR_NIL;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   401
+        char *minor_path;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   402
+        struct devlink_cbarg arg;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   403
+	struct node_args *nargs = (struct node_args *)args;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   404
+	di_devlink_handle_t devlink_hdl = nargs->dlink_hdl;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   405
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   406
+	/* walk each minor to find ugen devices */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   407
+        while ((minor = di_minor_next(node, minor)) != DI_MINOR_NIL) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   408
+                minor_path = di_devfs_minor_path(minor);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   409
+                arg.nargs = args;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   410
+		arg.myself = node;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   411
+                arg.minor = minor;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   412
+                (void) di_devlink_walk(devlink_hdl,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   413
+		    "^usb/[0-9a-f]+[.][0-9a-f]+", minor_path,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   414
+		    DI_PRIMARY_LINK, (void *)&arg, sunos_add_devices);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   415
+                di_devfs_path_free(minor_path);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   416
+        }
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   417
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   418
+	/* switch to a different node */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   419
+	nargs->last_ugenpath = NULL;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   420
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   421
+	return (DI_WALK_CONTINUE);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   422
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   423
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   424
+int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   425
+sunos_get_device_list(struct libusb_context * ctx,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   426
+	struct discovered_devs **discdevs)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   427
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   428
+	di_node_t root_node;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   429
+	struct node_args args;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   430
+	di_devlink_handle_t devlink_hdl;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   431
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   432
+	args.ctx = ctx;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   433
+	args.discdevs = discdevs;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   434
+	args.last_ugenpath = NULL;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   435
+	if ((root_node = di_init("/", DINFOCPYALL)) == DI_NODE_NIL) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   436
+		usbi_dbg("di_int() failed: %s", strerror(errno));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   437
+		return (LIBUSB_ERROR_IO);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   438
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   439
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   440
+	if ((devlink_hdl = di_devlink_init(NULL, 0)) == NULL) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   441
+		di_fini(root_node);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   442
+		usbi_dbg("di_devlink_init() failed: %s", strerror(errno));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   443
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   444
+		return (LIBUSB_ERROR_IO);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   445
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   446
+	args.dlink_hdl = devlink_hdl;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   447
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   448
+	/* walk each node to find USB devices */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   449
+	if (di_walk_node(root_node, DI_WALK_SIBFIRST, &args,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   450
+	    sunos_walk_minor_node_link) == -1) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   451
+		usbi_dbg("di_walk_node() failed: %s", strerror(errno));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   452
+		di_fini(root_node);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   453
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   454
+		return (LIBUSB_ERROR_IO);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   455
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   456
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   457
+	di_fini(root_node);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   458
+	di_devlink_fini(&devlink_hdl);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   459
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   460
+	usbi_dbg("%d devices", (*discdevs)->len);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   461
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   462
+	return ((*discdevs)->len);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   463
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   464
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   465
+static int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   466
+sunos_usb_open_ep0(sunos_dev_handle_priv_t *hpriv, sunos_dev_priv_t *dpriv)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   467
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   468
+	char filename[PATH_MAX + 1];
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   469
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   470
+	if (hpriv->eps[0].datafd > 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   471
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   472
+		return (LIBUSB_SUCCESS);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   473
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   474
+	snprintf(filename, PATH_MAX, "%s/cntrl0", dpriv->ugenpath);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   475
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   476
+	usbi_dbg("opening %s", filename);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   477
+	hpriv->eps[0].datafd = open(filename, O_RDWR);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   478
+	if (hpriv->eps[0].datafd < 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   479
+		return(_errno_to_libusb(errno));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   480
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   481
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   482
+	snprintf(filename, PATH_MAX, "%s/cntrl0stat", dpriv->ugenpath);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   483
+	hpriv->eps[0].statfd = open(filename, O_RDONLY);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   484
+	if (hpriv->eps[0].statfd < 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   485
+		close(hpriv->eps[0].datafd);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   486
+		hpriv->eps[0].datafd = -1;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   487
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   488
+		return(_errno_to_libusb(errno));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   489
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   490
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   491
+	return (LIBUSB_SUCCESS);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   492
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   493
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   494
+static void
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   495
+sunos_usb_close_all_eps(sunos_dev_handle_priv_t *hdev)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   496
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   497
+	int i;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   498
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   499
+	/* not close ep0 */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   500
+	for (i = 1; i < USB_MAXENDPOINTS; i++) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   501
+		if (hdev->eps[i].datafd != -1) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   502
+			(void) close(hdev->eps[i].datafd);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   503
+			hdev->eps[i].datafd = -1;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   504
+		}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   505
+		if (hdev->eps[i].statfd != -1) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   506
+			(void) close(hdev->eps[i].statfd);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   507
+			hdev->eps[i].statfd = -1;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   508
+		}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   509
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   510
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   511
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   512
+static void
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   513
+sunos_usb_close_ep0(sunos_dev_handle_priv_t *hdev, sunos_dev_priv_t *dpriv)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   514
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   515
+	if (hdev->eps[0].datafd >= 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   516
+		close(hdev->eps[0].datafd);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   517
+		close(hdev->eps[0].statfd);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   518
+		hdev->eps[0].datafd = -1;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   519
+		hdev->eps[0].statfd = -1;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   520
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   521
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   522
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   523
+static uchar_t
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   524
+sunos_usb_ep_index(uint8_t ep_addr)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   525
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   526
+	return ((ep_addr & LIBUSB_ENDPOINT_ADDRESS_MASK) +
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   527
+	    ((ep_addr & LIBUSB_ENDPOINT_DIR_MASK) ? 16 : 0));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   528
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   529
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   530
+static int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   531
+sunos_find_interface(struct libusb_device_handle *hdev,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   532
+    uint8_t endpoint, uint8_t *interface)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   533
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   534
+	struct libusb_config_descriptor *config;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   535
+	int r;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   536
+	int iface_idx;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   537
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   538
+	r = libusb_get_active_config_descriptor(hdev->dev, &config);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   539
+	if (r < 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   540
+		return (LIBUSB_ERROR_INVALID_PARAM);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   541
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   542
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   543
+	for (iface_idx = 0; iface_idx < config->bNumInterfaces; iface_idx++) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   544
+		const struct libusb_interface *iface =
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   545
+		    &config->interface[iface_idx];
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   546
+		int altsetting_idx;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   547
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   548
+		for (altsetting_idx = 0; altsetting_idx < iface->num_altsetting;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   549
+		    altsetting_idx++) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   550
+			const struct libusb_interface_descriptor *altsetting =
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   551
+			    &iface->altsetting[altsetting_idx];
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   552
+			int ep_idx;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   553
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   554
+			for (ep_idx = 0; ep_idx < altsetting->bNumEndpoints;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   555
+			    ep_idx++) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   556
+				const struct libusb_endpoint_descriptor *ep =
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   557
+					&altsetting->endpoint[ep_idx];
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   558
+				if (ep->bEndpointAddress == endpoint) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   559
+					*interface = iface_idx;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   560
+					libusb_free_config_descriptor(config);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   561
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   562
+					return (LIBUSB_SUCCESS);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   563
+				}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   564
+			}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   565
+		}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   566
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   567
+	libusb_free_config_descriptor(config);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   568
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   569
+	return (LIBUSB_ERROR_INVALID_PARAM);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   570
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   571
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   572
+static int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   573
+sunos_check_device_and_status_open(struct libusb_device_handle *hdl,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   574
+    uint8_t ep_addr, int ep_type)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   575
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   576
+	char	filename[PATH_MAX + 1], statfilename[PATH_MAX + 1];
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   577
+	char	cfg_num[16], alt_num[16];
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   578
+	int	fd, fdstat, mode;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   579
+	uint8_t	ifc = 0;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   580
+	uint8_t	ep_index;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   581
+	sunos_dev_handle_priv_t *hpriv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   582
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   583
+	usbi_dbg("open ep 0x%02x", ep_addr);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   584
+	hpriv = (sunos_dev_handle_priv_t *)hdl->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   585
+	ep_index = sunos_usb_ep_index(ep_addr);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   586
+	/* ep already opened */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   587
+	if ((hpriv->eps[ep_index].datafd > 0) &&
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   588
+	    (hpriv->eps[ep_index].statfd > 0)) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   589
+		usbi_dbg("ep 0x%02x already opened, return success",
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   590
+			ep_addr);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   591
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   592
+		return (0);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   593
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   594
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   595
+	if (sunos_find_interface(hdl, ep_addr, &ifc) < 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   596
+		usbi_dbg("can't find interface for endpoint 0x%02x",
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   597
+		    ep_addr);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   598
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   599
+		return (LIBUSB_ERROR_ACCESS);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   600
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   601
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   602
+	/* create filename */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   603
+	if (hpriv->config_index > 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   604
+		(void) snprintf(cfg_num, sizeof (cfg_num), "cfg%d",
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   605
+		    hpriv->config_index + 1);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   606
+	} else {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   607
+		bzero(cfg_num, sizeof (cfg_num));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   608
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   609
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   610
+	if (hpriv->altsetting[ifc] > 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   611
+		(void) snprintf(alt_num, sizeof (alt_num), ".%d",
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   612
+		    hpriv->altsetting[ifc]);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   613
+	} else {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   614
+		bzero(alt_num, sizeof (alt_num));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   615
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   616
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   617
+	(void) snprintf(filename, PATH_MAX, "%s/%sif%d%s%s%d",
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   618
+	    hpriv->dpriv->ugenpath, cfg_num, ifc, alt_num,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   619
+	    (ep_addr & LIBUSB_ENDPOINT_DIR_MASK) ? "in" :
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   620
+	    "out", (ep_addr & LIBUSB_ENDPOINT_ADDRESS_MASK));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   621
+	(void) snprintf(statfilename, PATH_MAX, "%sstat", filename);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   622
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   623
+	/*
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   624
+	 * for interrupt IN endpoints, we need to enable one xfer
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   625
+	 * mode before opening the endpoint
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   626
+	 */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   627
+	if ((ep_type == LIBUSB_TRANSFER_TYPE_INTERRUPT) &&
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   628
+	    (ep_addr & LIBUSB_ENDPOINT_IN)) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   629
+		char	control = USB_EP_INTR_ONE_XFER;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   630
+		int	count;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   631
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   632
+		/* open the status device node for the ep first RDWR */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   633
+		if ((fdstat = open(statfilename, O_RDWR)) == -1) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   634
+			usbi_dbg("can't open %s RDWR: %d",
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   635
+				statfilename, errno);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   636
+		} else {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   637
+			count = write(fdstat, &control, sizeof (control));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   638
+			if (count != 1) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   639
+				/* this should have worked */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   640
+				usbi_dbg("can't write to %s: %d",
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   641
+					statfilename, errno);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   642
+				(void) close(fdstat);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   643
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   644
+				return (errno);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   645
+			}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   646
+			/* close status node and open xfer node first */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   647
+			close (fdstat);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   648
+		}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   649
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   650
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   651
+	/* open the xfer node first in case alt needs to be changed */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   652
+	if (ep_type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   653
+		mode = O_RDWR;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   654
+	} else if (ep_addr & LIBUSB_ENDPOINT_IN) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   655
+		mode = O_RDONLY;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   656
+	} else {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   657
+		mode = O_WRONLY;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   658
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   659
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   660
+	/*
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   661
+	 * IMPORTANT: must open data xfer node first and then open stat node
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   662
+	 * Otherwise, it will fail on multi-config or multi-altsetting devices
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   663
+	 * with "Device Busy" error. See ugen_epxs_switch_cfg_alt() and
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   664
+	 * ugen_epxs_check_alt_switch() in ugen driver source code.
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   665
+	 */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   666
+	if ((fd = open(filename, mode)) == -1) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   667
+		usbi_dbg("can't open %s: %d(%s)", filename, errno,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   668
+		    strerror(errno));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   669
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   670
+		return (errno);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   671
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   672
+	/* open the status node */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   673
+	if ((fdstat = open(statfilename, O_RDONLY)) == -1) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   674
+		usbi_dbg("can't open %s: %d", statfilename, errno);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   675
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   676
+		(void) close(fd);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   677
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   678
+		return (errno);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   679
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   680
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   681
+	hpriv->eps[ep_index].datafd = fd;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   682
+	hpriv->eps[ep_index].statfd = fdstat;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   683
+	usbi_dbg("ep=0x%02x datafd=%d, statfd=%d", ep_addr, fd, fdstat);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   684
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   685
+	return (0);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   686
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   687
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   688
+int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   689
+sunos_open(struct libusb_device_handle *handle)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   690
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   691
+	sunos_dev_handle_priv_t	*hpriv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   692
+	sunos_dev_priv_t	*dpriv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   693
+	int	i;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   694
+	int	ret;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   695
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   696
+	hpriv = (sunos_dev_handle_priv_t *)handle->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   697
+	dpriv = (sunos_dev_priv_t *)handle->dev->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   698
+	hpriv->dpriv = dpriv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   699
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   700
+	/* set all file descriptors to "closed" */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   701
+	for (i = 0; i < USB_MAXENDPOINTS; i++) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   702
+		hpriv->eps[i].datafd = -1;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   703
+		hpriv->eps[i].statfd = -1;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   704
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   705
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   706
+	if ((ret = sunos_usb_open_ep0(hpriv, dpriv)) != LIBUSB_SUCCESS) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   707
+		usbi_dbg("fail: %d", ret);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   708
+		return (ret);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   709
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   710
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   711
+	return (LIBUSB_SUCCESS);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   712
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   713
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   714
+void
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   715
+sunos_close(struct libusb_device_handle *handle)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   716
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   717
+	sunos_dev_handle_priv_t *hpriv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   718
+	sunos_dev_priv_t *dpriv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   719
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   720
+	usbi_dbg("");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   721
+	if (!handle) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   722
+		return;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   723
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   724
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   725
+	hpriv = (sunos_dev_handle_priv_t *)handle->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   726
+	if (!hpriv) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   727
+		return;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   728
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   729
+	dpriv = (sunos_dev_priv_t *)handle->dev->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   730
+	if (!dpriv) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   731
+		return;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   732
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   733
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   734
+	sunos_usb_close_all_eps(hpriv);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   735
+	sunos_usb_close_ep0(hpriv, dpriv);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   736
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   737
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   738
+int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   739
+sunos_get_device_descriptor(struct libusb_device *dev, uint8_t *buf,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   740
+    int *host_endian)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   741
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   742
+	sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)dev->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   743
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   744
+	memcpy(buf, &dpriv->dev_descr, LIBUSB_DT_DEVICE_SIZE);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   745
+	*host_endian = 0;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   746
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   747
+	return (LIBUSB_SUCCESS);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   748
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   749
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   750
+int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   751
+sunos_get_active_config_descriptor(struct libusb_device *dev,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   752
+    uint8_t *buf, size_t len, int *host_endian)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   753
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   754
+	sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)dev->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   755
+	struct libusb_config_descriptor *cfg;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   756
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   757
+	cfg = (struct libusb_config_descriptor *)dpriv->raw_cfgdescr;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   758
+	len = MIN(len, libusb_le16_to_cpu(cfg->wTotalLength));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   759
+	memcpy(buf, dpriv->raw_cfgdescr, len);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   760
+	*host_endian = 0;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   761
+	usbi_dbg("len %d", len);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   762
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   763
+	return (len);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   764
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   765
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   766
+int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   767
+sunos_get_config_descriptor(struct libusb_device *dev, uint8_t idx,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   768
+    uint8_t *buf, size_t len, int *host_endian)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   769
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   770
+	/* XXX */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   771
+	return(sunos_get_active_config_descriptor(dev, buf, len, host_endian));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   772
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   773
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   774
+int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   775
+sunos_get_configuration(struct libusb_device_handle *handle, int *config)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   776
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   777
+	sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)handle->dev->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   778
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   779
+	*config = dpriv->cfgvalue;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   780
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   781
+	usbi_dbg("bConfigurationValue %d", *config);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   782
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   783
+	return (LIBUSB_SUCCESS);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   784
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   785
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   786
+int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   787
+sunos_set_configuration(struct libusb_device_handle *handle, int config)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   788
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   789
+	sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)handle->dev->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   790
+	usbi_dbg("bConfigurationValue %d", config);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   791
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   792
+	if (dpriv->ugenpath == NULL)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   793
+		return (LIBUSB_ERROR_NOT_SUPPORTED);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   794
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   795
+	if (config < 1 || config > dpriv->dev_descr.bNumConfigurations)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   796
+		return (LIBUSB_ERROR_INVALID_PARAM);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   797
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   798
+	dpriv->cfgvalue = config;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   799
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   800
+	return (LIBUSB_SUCCESS);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   801
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   802
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   803
+int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   804
+sunos_claim_interface(struct libusb_device_handle *handle, int iface)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   805
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   806
+	usbi_dbg("iface %d", iface);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   807
+	if (iface < 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   808
+		return (LIBUSB_ERROR_INVALID_PARAM);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   809
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   810
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   811
+	return (LIBUSB_SUCCESS);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   812
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   813
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   814
+int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   815
+sunos_release_interface(struct libusb_device_handle *handle, int iface)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   816
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   817
+	sunos_dev_handle_priv_t *hpriv =
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   818
+	    (sunos_dev_handle_priv_t *)handle->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   819
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   820
+	usbi_dbg("iface %d", iface);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   821
+	if (iface < 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   822
+		return (LIBUSB_ERROR_INVALID_PARAM);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   823
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   824
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   825
+	/* XXX: can we release it? */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   826
+	hpriv->altsetting[iface] = 0;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   827
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   828
+	return (LIBUSB_SUCCESS);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   829
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   830
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   831
+int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   832
+sunos_set_interface_altsetting(struct libusb_device_handle *handle, int iface,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   833
+    int altsetting)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   834
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   835
+	sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)handle->dev->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   836
+	sunos_dev_handle_priv_t *hpriv =
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   837
+	    (sunos_dev_handle_priv_t *)handle->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   838
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   839
+	usbi_dbg("iface %d, setting %d", iface, altsetting);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   840
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   841
+	if (iface < 0 || altsetting < 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   842
+		return (LIBUSB_ERROR_INVALID_PARAM);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   843
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   844
+	if (dpriv->ugenpath == NULL)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   845
+		return (LIBUSB_ERROR_NOT_FOUND);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   846
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   847
+	/* XXX: can we switch altsetting? */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   848
+	hpriv->altsetting[iface] = altsetting;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   849
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   850
+	return (LIBUSB_SUCCESS);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   851
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   852
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   853
+static void
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   854
+usb_dump_data(unsigned char *data, size_t size)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   855
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   856
+	int i;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   857
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   858
+	if (getenv("LIBUSB_DEBUG") == NULL) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   859
+		return;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   860
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   861
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   862
+	(void) fprintf(stderr, "data dump:");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   863
+	for (i = 0; i < size; i++) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   864
+		if (i % 16 == 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   865
+			(void) fprintf(stderr, "\n%08x	", i);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   866
+		}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   867
+		(void) fprintf(stderr, "%02x ", (uchar_t)data[i]);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   868
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   869
+	(void) fprintf(stderr, "\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   870
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   871
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   872
+static void
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   873
+sunos_async_callback(union sigval arg)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   874
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   875
+	struct sunos_transfer_priv *tpriv =
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   876
+	    (struct sunos_transfer_priv *)arg.sival_ptr;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   877
+	struct libusb_transfer *xfer = tpriv->transfer;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   878
+	struct aiocb *aiocb = &tpriv->aiocb;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   879
+	int ret;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   880
+	sunos_dev_handle_priv_t *hpriv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   881
+	uint8_t ep;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   882
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   883
+	hpriv = (sunos_dev_handle_priv_t *)xfer->dev_handle->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   884
+	ep = sunos_usb_ep_index(xfer->endpoint);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   885
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   886
+	ret = aio_error(aiocb);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   887
+	if (ret != 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   888
+		xfer->status = sunos_usb_get_status(hpriv->eps[ep].statfd);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   889
+	} else {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   890
+		xfer->actual_length =
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   891
+		    LIBUSB_TRANSFER_TO_USBI_TRANSFER(xfer)->transferred =
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   892
+		    aio_return(aiocb);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   893
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   894
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   895
+	usb_dump_data(xfer->buffer, xfer->actual_length);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   896
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   897
+	usbi_dbg("ret=%d, len=%d, actual_len=%d", ret, xfer->length,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   898
+	    xfer->actual_length);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   899
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   900
+	/* async notification */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   901
+	usbi_signal_transfer_completion(LIBUSB_TRANSFER_TO_USBI_TRANSFER(xfer));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   902
+	free(aiocb);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   903
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   904
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   905
+static int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   906
+sunos_do_async_io(struct libusb_transfer *transfer)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   907
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   908
+	int ret = -1;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   909
+	struct aiocb *aiocb;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   910
+	sunos_dev_handle_priv_t *hpriv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   911
+	uint8_t ep;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   912
+	struct sunos_transfer_priv *tpriv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   913
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   914
+	usbi_dbg("");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   915
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   916
+	tpriv = usbi_transfer_get_os_priv(LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   917
+	hpriv = (sunos_dev_handle_priv_t *)transfer->dev_handle->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   918
+	ep = sunos_usb_ep_index(transfer->endpoint);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   919
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   920
+	tpriv->transfer = transfer;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   921
+	aiocb = &tpriv->aiocb;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   922
+	bzero(aiocb, sizeof (*aiocb));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   923
+	aiocb->aio_fildes = hpriv->eps[ep].datafd;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   924
+	aiocb->aio_buf = transfer->buffer;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   925
+	aiocb->aio_nbytes = transfer->length;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   926
+	aiocb->aio_lio_opcode =
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   927
+	    ((transfer->endpoint & LIBUSB_ENDPOINT_DIR_MASK) ==
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   928
+	    LIBUSB_ENDPOINT_IN) ? LIO_READ:LIO_WRITE;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   929
+	aiocb->aio_sigevent.sigev_notify = SIGEV_THREAD;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   930
+	aiocb->aio_sigevent.sigev_value.sival_ptr = tpriv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   931
+	aiocb->aio_sigevent.sigev_notify_function = sunos_async_callback;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   932
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   933
+	if (aiocb->aio_lio_opcode == LIO_READ) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   934
+		ret = aio_read(aiocb);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   935
+	} else {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   936
+		ret = aio_write(aiocb);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   937
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   938
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   939
+	return (ret);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   940
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   941
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   942
+/* return the number of bytes read/written */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   943
+static int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   944
+usb_do_io(int fd, int stat_fd, char *data, size_t size, int flag, int *status)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   945
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   946
+	int error;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   947
+	int ret = -1;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   948
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   949
+	usbi_dbg("usb_do_io(): datafd=%d statfd=%d size=0x%x flag=%s",
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   950
+	    fd, stat_fd, size, flag? "WRITE":"READ");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   951
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   952
+	switch (flag) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   953
+	case READ:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   954
+		errno = 0;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   955
+		ret = read(fd, data, size);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   956
+		usb_dump_data(data, size);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   957
+		break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   958
+	case WRITE:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   959
+		usb_dump_data(data, size);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   960
+		errno = 0;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   961
+		ret = write(fd, data, size);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   962
+		break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   963
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   964
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   965
+	usbi_dbg("usb_do_io(): amount=%d", ret);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   966
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   967
+	if (ret < 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   968
+		int save_errno = errno;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   969
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   970
+		usbi_dbg("TID=%x io %s errno=%d(%s) ret=%d", pthread_self(),
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   971
+		    flag?"WRITE":"READ", errno, strerror(errno), ret);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   972
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   973
+		/* sunos_usb_get_status will do a read and overwrite errno */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   974
+		error = sunos_usb_get_status(stat_fd);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   975
+		usbi_dbg("io status=%d errno=%d(%s)", error,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   976
+			save_errno, strerror(save_errno));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   977
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   978
+		if (status) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   979
+			*status = save_errno;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   980
+		}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   981
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   982
+		return (save_errno);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   983
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   984
+	} else if (status) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   985
+		*status = 0;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   986
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   987
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   988
+	return (ret);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   989
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   990
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   991
+static int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   992
+solaris_submit_ctrl_on_default(struct libusb_transfer *transfer)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   993
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   994
+	int		ret = -1, setup_ret;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   995
+	int		status;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   996
+	sunos_dev_handle_priv_t *hpriv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   997
+	struct		libusb_device_handle *hdl = transfer->dev_handle;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   998
+	uint16_t	wLength;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
   999
+	uint8_t		*data = transfer->buffer;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1000
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1001
+	hpriv = (sunos_dev_handle_priv_t *)hdl->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1002
+	wLength = transfer->length - LIBUSB_CONTROL_SETUP_SIZE;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1003
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1004
+	if (hpriv->eps[0].datafd == -1) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1005
+		usbi_dbg("ep0 not opened");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1006
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1007
+		return (LIBUSB_ERROR_NOT_FOUND);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1008
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1009
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1010
+	if ((data[0] & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_IN) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1011
+		usbi_dbg("IN request");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1012
+		ret = usb_do_io(hpriv->eps[0].datafd,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1013
+		    hpriv->eps[0].statfd, (char *)data, LIBUSB_CONTROL_SETUP_SIZE,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1014
+		    WRITE, (int *)&status);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1015
+	} else {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1016
+		usbi_dbg("OUT request");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1017
+		ret = usb_do_io(hpriv->eps[0].datafd, hpriv->eps[0].statfd,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1018
+		    transfer->buffer, transfer->length, WRITE,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1019
+		    (int *)&transfer->status);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1020
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1021
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1022
+	setup_ret = ret;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1023
+	if (ret < LIBUSB_CONTROL_SETUP_SIZE) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1024
+		usbi_dbg("error sending control msg: %d", ret);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1025
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1026
+		return (LIBUSB_ERROR_IO);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1027
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1028
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1029
+	ret = transfer->length - LIBUSB_CONTROL_SETUP_SIZE;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1030
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1031
+	/* Read the remaining bytes for IN request */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1032
+	if ((wLength) && ((data[0] & LIBUSB_ENDPOINT_DIR_MASK) ==
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1033
+	    LIBUSB_ENDPOINT_IN)) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1034
+		usbi_dbg("DATA: %d", transfer->length - setup_ret);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1035
+		ret = usb_do_io(hpriv->eps[0].datafd,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1036
+			hpriv->eps[0].statfd,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1037
+			(char *)transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1038
+			wLength, READ, (int *)&transfer->status);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1039
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1040
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1041
+	if (ret >= 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1042
+		transfer->actual_length = ret;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1043
+		LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer)->transferred = ret;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1044
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1045
+	usbi_dbg("Done: ctrl data bytes %d", ret);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1046
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1047
+	/* sync transfer handling */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1048
+	ret = usbi_handle_transfer_completion(LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer),
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1049
+	    transfer->status);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1050
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1051
+	return (ret);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1052
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1053
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1054
+int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1055
+sunos_clear_halt(struct libusb_device_handle *handle, uint8_t endpoint)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1056
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1057
+	int ret;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1058
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1059
+	usbi_dbg("endpoint=0x%02x", endpoint);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1060
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1061
+	ret = libusb_control_transfer(handle, LIBUSB_ENDPOINT_OUT |
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1062
+	    LIBUSB_RECIPIENT_ENDPOINT | LIBUSB_REQUEST_TYPE_STANDARD,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1063
+	    LIBUSB_REQUEST_CLEAR_FEATURE, 0, endpoint, NULL, 0, 1000);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1064
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1065
+	usbi_dbg("ret=%d", ret);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1066
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1067
+	return (ret);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1068
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1069
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1070
+int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1071
+sunos_reset_device(struct libusb_device_handle *handle)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1072
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1073
+	usbi_dbg("");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1074
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1075
+	return (LIBUSB_ERROR_NOT_SUPPORTED);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1076
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1077
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1078
+void
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1079
+sunos_destroy_device(struct libusb_device *dev)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1080
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1081
+	sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)dev->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1082
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1083
+	usbi_dbg("");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1084
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1085
+	free(dpriv->raw_cfgdescr);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1086
+	free(dpriv->ugenpath);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1087
+	free(dpriv->phypath);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1088
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1089
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1090
+int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1091
+sunos_submit_transfer(struct usbi_transfer *itransfer)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1092
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1093
+	struct	libusb_transfer *transfer;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1094
+	struct	libusb_device_handle *hdl;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1095
+	int	err = 0;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1096
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1097
+	transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1098
+	hdl = transfer->dev_handle;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1099
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1100
+	err = sunos_check_device_and_status_open(hdl,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1101
+	    transfer->endpoint, transfer->type);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1102
+	if (err < 0) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1103
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1104
+		return (_errno_to_libusb(err));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1105
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1106
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1107
+	switch (transfer->type) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1108
+	case LIBUSB_TRANSFER_TYPE_CONTROL:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1109
+		/* sync transfer */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1110
+		usbi_dbg("CTRL transfer: %d", transfer->length);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1111
+		err = solaris_submit_ctrl_on_default(transfer);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1112
+		break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1113
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1114
+	case LIBUSB_TRANSFER_TYPE_BULK:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1115
+		/* fallthru */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1116
+	case LIBUSB_TRANSFER_TYPE_INTERRUPT:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1117
+		if (transfer->type == LIBUSB_TRANSFER_TYPE_BULK)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1118
+			usbi_dbg("BULK transfer: %d", transfer->length);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1119
+		else
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1120
+			usbi_dbg("INTR transfer: %d", transfer->length);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1121
+		err = sunos_do_async_io(transfer);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1122
+		break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1123
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1124
+	case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1125
+		/* Isochronous/Stream is not supported */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1126
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1127
+		/* fallthru */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1128
+	case LIBUSB_TRANSFER_TYPE_BULK_STREAM:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1129
+		if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1130
+			usbi_dbg("ISOC transfer: %d", transfer->length);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1131
+		else
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1132
+			usbi_dbg("BULK STREAM transfer: %d", transfer->length);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1133
+		err = LIBUSB_ERROR_NOT_SUPPORTED;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1134
+		break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1135
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1136
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1137
+	return (err);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1138
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1139
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1140
+int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1141
+sunos_cancel_transfer(struct usbi_transfer *itransfer)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1142
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1143
+	sunos_xfer_priv_t	*tpriv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1144
+	sunos_dev_handle_priv_t	*hpriv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1145
+	struct libusb_transfer	*transfer;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1146
+	struct aiocb	*aiocb;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1147
+	uint8_t		ep;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1148
+	int		ret;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1149
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1150
+	tpriv = usbi_transfer_get_os_priv(itransfer);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1151
+	aiocb = &tpriv->aiocb;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1152
+	transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1153
+	hpriv = (sunos_dev_handle_priv_t *)transfer->dev_handle->os_priv;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1154
+	ep = sunos_usb_ep_index(transfer->endpoint);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1155
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1156
+	ret = aio_cancel(hpriv->eps[ep].datafd, aiocb);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1157
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1158
+	usbi_dbg("aio->fd=%d fd=%d ret = %d, %s", aiocb->aio_fildes,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1159
+	    hpriv->eps[ep].datafd, ret, (ret == AIO_CANCELED)?
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1160
+	    strerror(0):strerror(errno));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1161
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1162
+	if (ret != AIO_CANCELED) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1163
+		ret = _errno_to_libusb(errno);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1164
+	} else {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1165
+	/*
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1166
+	 * we don't need to call usbi_handle_transfer_cancellation(),
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1167
+	 * because we'll handle everything in sunos_async_callback.
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1168
+	 */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1169
+		ret = LIBUSB_SUCCESS;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1170
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1171
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1172
+	return (ret);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1173
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1174
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1175
+void
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1176
+sunos_clear_transfer_priv(struct usbi_transfer *itransfer)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1177
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1178
+	usbi_dbg("");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1179
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1180
+	/* Nothing to do */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1181
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1182
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1183
+int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1184
+sunos_handle_transfer_completion(struct usbi_transfer *itransfer)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1185
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1186
+	return usbi_handle_transfer_completion(itransfer, LIBUSB_TRANSFER_COMPLETED);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1187
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1188
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1189
+int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1190
+sunos_clock_gettime(int clkid, struct timespec *tp)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1191
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1192
+	usbi_dbg("clock %d", clkid);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1193
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1194
+	if (clkid == USBI_CLOCK_REALTIME)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1195
+		return clock_gettime(CLOCK_REALTIME, tp);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1196
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1197
+	if (clkid == USBI_CLOCK_MONOTONIC)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1198
+		return clock_gettime(CLOCK_MONOTONIC, tp);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1199
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1200
+	return (LIBUSB_ERROR_INVALID_PARAM);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1201
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1202
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1203
+int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1204
+_errno_to_libusb(int err)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1205
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1206
+	usbi_dbg("error: %s (%d)", strerror(err), err);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1207
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1208
+	switch (err) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1209
+	case EIO:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1210
+		return (LIBUSB_ERROR_IO);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1211
+	case EACCES:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1212
+		return (LIBUSB_ERROR_ACCESS);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1213
+	case ENOENT:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1214
+		return (LIBUSB_ERROR_NO_DEVICE);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1215
+	case ENOMEM:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1216
+		return (LIBUSB_ERROR_NO_MEM);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1217
+	case ETIMEDOUT:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1218
+		return (LIBUSB_ERROR_TIMEOUT);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1219
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1220
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1221
+	return (LIBUSB_ERROR_OTHER);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1222
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1223
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1224
+/*
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1225
+ * sunos_usb_get_status:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1226
+ *	gets status of endpoint
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1227
+ *
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1228
+ * Returns: ugen's last cmd status
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1229
+ */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1230
+static int
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1231
+sunos_usb_get_status(int fd)
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1232
+{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1233
+	int status, ret;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1234
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1235
+	usbi_dbg("sunos_usb_get_status(): fd=%d", fd);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1236
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1237
+	ret = read(fd, &status, sizeof (status));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1238
+	if (ret == sizeof (status)) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1239
+		switch (status) {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1240
+		case USB_LC_STAT_NOERROR:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1241
+			usbi_dbg("No Error");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1242
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1243
+		case USB_LC_STAT_CRC:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1244
+			usbi_dbg("CRC Timeout Detected\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1245
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1246
+		case USB_LC_STAT_BITSTUFFING:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1247
+			usbi_dbg("Bit Stuffing Violation\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1248
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1249
+		case USB_LC_STAT_DATA_TOGGLE_MM:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1250
+			usbi_dbg("Data Toggle Mismatch\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1251
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1252
+		case USB_LC_STAT_STALL:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1253
+			usbi_dbg("End Point Stalled\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1254
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1255
+		case USB_LC_STAT_DEV_NOT_RESP:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1256
+			usbi_dbg("Device is Not Responding\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1257
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1258
+		case USB_LC_STAT_PID_CHECKFAILURE:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1259
+			usbi_dbg("PID Check Failure\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1260
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1261
+		case USB_LC_STAT_UNEXP_PID:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1262
+			usbi_dbg("Unexpected PID\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1263
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1264
+		case USB_LC_STAT_DATA_OVERRUN:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1265
+			usbi_dbg("Data Exceeded Size\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1266
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1267
+		case USB_LC_STAT_DATA_UNDERRUN:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1268
+			usbi_dbg("Less data received\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1269
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1270
+		case USB_LC_STAT_BUFFER_OVERRUN:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1271
+			usbi_dbg("Buffer Size Exceeded\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1272
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1273
+		case USB_LC_STAT_BUFFER_UNDERRUN:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1274
+			usbi_dbg("Buffer Underrun\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1275
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1276
+		case USB_LC_STAT_TIMEOUT:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1277
+			usbi_dbg("Command Timed Out\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1278
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1279
+		case USB_LC_STAT_NOT_ACCESSED:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1280
+			usbi_dbg("Not Accessed by h/w\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1281
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1282
+		case USB_LC_STAT_UNSPECIFIED_ERR:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1283
+			usbi_dbg("Unspecified Error\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1284
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1285
+		case USB_LC_STAT_NO_BANDWIDTH:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1286
+			usbi_dbg("No Bandwidth\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1287
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1288
+		case USB_LC_STAT_HW_ERR:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1289
+			usbi_dbg("Host Controller h/w Error\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1290
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1291
+		case USB_LC_STAT_SUSPENDED:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1292
+			usbi_dbg("Device was Suspended\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1293
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1294
+		case USB_LC_STAT_DISCONNECTED:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1295
+			usbi_dbg("Device was Disconnected\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1296
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1297
+		case USB_LC_STAT_INTR_BUF_FULL:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1298
+			usbi_dbg("Interrupt buffer was full\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1299
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1300
+		case USB_LC_STAT_INVALID_REQ:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1301
+			usbi_dbg("Request was Invalid\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1302
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1303
+		case USB_LC_STAT_INTERRUPTED:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1304
+			usbi_dbg("Request was Interrupted\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1305
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1306
+		case USB_LC_STAT_NO_RESOURCES:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1307
+			usbi_dbg("No resources available for "
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1308
+			    "request\n");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1309
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1310
+		case USB_LC_STAT_INTR_POLLING_FAILED:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1311
+			usbi_dbg("Failed to Restart Poll");
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1312
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1313
+		default:
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1314
+			usbi_dbg("Error Not Determined %d\n",
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1315
+			    status);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1316
+			break;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1317
+		}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1318
+	} else {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1319
+		usbi_dbg("read stat error: %s",strerror(errno));
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1320
+		status = -1;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1321
+	}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1322
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1323
+	return (status);
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1324
+}
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1325
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1326
+const struct usbi_os_backend sunos_backend = {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1327
+        .name = "Solaris",
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1328
+        .caps = 0,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1329
+        .init = sunos_init,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1330
+        .exit = sunos_exit,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1331
+        .get_device_list = sunos_get_device_list,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1332
+        .get_device_descriptor = sunos_get_device_descriptor,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1333
+        .get_active_config_descriptor = sunos_get_active_config_descriptor,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1334
+        .get_config_descriptor = sunos_get_config_descriptor,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1335
+        .hotplug_poll = NULL,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1336
+        .open = sunos_open,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1337
+        .close = sunos_close,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1338
+        .get_configuration = sunos_get_configuration,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1339
+        .set_configuration = sunos_set_configuration,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1340
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1341
+        .claim_interface = sunos_claim_interface,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1342
+        .release_interface = sunos_release_interface,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1343
+        .set_interface_altsetting = sunos_set_interface_altsetting,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1344
+        .clear_halt = sunos_clear_halt,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1345
+        .reset_device = sunos_reset_device, /* TODO */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1346
+        .alloc_streams = NULL,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1347
+        .free_streams = NULL,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1348
+        .kernel_driver_active = NULL,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1349
+        .detach_kernel_driver = NULL,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1350
+        .attach_kernel_driver = NULL,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1351
+        .destroy_device = sunos_destroy_device,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1352
+        .submit_transfer = sunos_submit_transfer,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1353
+        .cancel_transfer = sunos_cancel_transfer,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1354
+	.handle_events = NULL,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1355
+        .clear_transfer_priv = sunos_clear_transfer_priv,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1356
+        .handle_transfer_completion = sunos_handle_transfer_completion,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1357
+        .clock_gettime = sunos_clock_gettime,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1358
+        .device_priv_size = sizeof(sunos_dev_priv_t),
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1359
+        .device_handle_priv_size = sizeof(sunos_dev_handle_priv_t),
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1360
+        .transfer_priv_size = sizeof(sunos_xfer_priv_t),
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1361
+};
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1362
diff -Naur libusb-1.0.20/libusb/os/sunos_usb.h libusb-1.0.20.new/libusb/os/sunos_usb.h
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1363
--- libusb-1.0.20/libusb/os/sunos_usb.h	1969-12-31 16:00:00.000000000 -0800
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1364
+++ libusb-1.0.20.new/libusb/os/sunos_usb.h	2016-03-10 00:24:37.910437590 -0800
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1365
@@ -0,0 +1,74 @@
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1366
+/*
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1367
+ *
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1368
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1369
+ *
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1370
+ * This library is free software; you can redistribute it and/or
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1371
+ * modify it under the terms of the GNU Lesser General Public
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1372
+ * License as published by the Free Software Foundation; either
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1373
+ * version 2.1 of the License, or (at your option) any later version.
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1374
+ *
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1375
+ * This library is distributed in the hope that it will be useful,
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1376
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1377
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1378
+ * Lesser General Public License for more details.
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1379
+ *
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1380
+ * You should have received a copy of the GNU Lesser General Public
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1381
+ * License along with this library; if not, write to the Free Software
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1382
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1383
+ */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1384
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1385
+#ifndef	__SUNOS_H__
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1386
+#define	__SUNOS_H__
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1387
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1388
+#include <libdevinfo.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1389
+#include <pthread.h>
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1390
+#include "libusbi.h"
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1391
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1392
+#define	READ	0
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1393
+#define	WRITE	1
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1394
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1395
+typedef struct sunos_device_priv {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1396
+	uint8_t	cfgvalue;		/* active config value */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1397
+	uint8_t	*raw_cfgdescr;		/* active config descriptor */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1398
+	struct libusb_device_descriptor	dev_descr;	/* usb device descriptor */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1399
+	char	*ugenpath;		/* name of the ugen(4) node */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1400
+	char	*phypath;		/* physical path */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1401
+} sunos_dev_priv_t;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1402
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1403
+typedef	struct endpoint {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1404
+	int datafd;	/* data file */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1405
+	int statfd;	/* state file */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1406
+} sunos_ep_priv_t;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1407
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1408
+typedef struct sunos_device_handle_priv {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1409
+	uint8_t			altsetting[USB_MAXINTERFACES];	/* a interface's alt */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1410
+	uint8_t			config_index;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1411
+	sunos_ep_priv_t		eps[USB_MAXENDPOINTS];
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1412
+	sunos_dev_priv_t	*dpriv; /* device private */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1413
+} sunos_dev_handle_priv_t;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1414
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1415
+typedef	struct sunos_transfer_priv {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1416
+	struct aiocb		aiocb;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1417
+	struct libusb_transfer	*transfer;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1418
+} sunos_xfer_priv_t;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1419
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1420
+struct node_args {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1421
+	struct libusb_context	*ctx;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1422
+	struct discovered_devs	**discdevs;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1423
+	const char		*last_ugenpath;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1424
+	di_devlink_handle_t	dlink_hdl;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1425
+};
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1426
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1427
+struct devlink_cbarg {
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1428
+	struct node_args	*nargs;	/* di node walk arguments */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1429
+	di_node_t		myself;	/* the di node */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1430
+	di_minor_t		minor;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1431
+};
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1432
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1433
+/* AIO callback args */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1434
+struct aio_callback_args{
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1435
+	struct libusb_transfer *transfer;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1436
+	struct aiocb aiocb;
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1437
+};
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1438
+
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1439
+#endif /* __SUNOS_H__ */
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1440
diff -Naur libusb-1.0.20/libusb-1.0.pc.in libusb-1.0.20.new/libusb-1.0.pc.in
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1441
--- libusb-1.0.20/libusb-1.0.pc.in	2015-07-28 22:18:38.000000000 -0700
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1442
+++ libusb-1.0.20.new/libusb-1.0.pc.in	2016-03-10 00:17:29.567059098 -0800
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1443
@@ -4,7 +4,7 @@
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1444
 includedir=@includedir@
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1445
 
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1446
 Name: libusb-1.0
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1447
-Description: C API for USB device access from Linux, Mac OS X, Windows and OpenBSD/NetBSD userspace
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1448
+Description: C API for USB device access from Linux, Mac OS X, Windows, OpenBSD/NetBSD and Solaris userspace
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1449
 Version: @VERSION@
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1450
 Libs: -L${libdir} -lusb-1.0
f969c4942506 PSARC/2016/137 libusb 1.0
Jan Parcel <jan.parcel@oracle.com>
parents:
diff changeset
  1451
 Libs.private: @LIBS@