Lines Matching refs:sisusb

3  * sisusb - usb kernel driver for SiS315(E) based USB2VGA dongles
53 #include "sisusb.h"
61 static void sisusb_free_buffers(struct sisusb_usb_data *sisusb)
66 kfree(sisusb->obuf[i]);
67 sisusb->obuf[i] = NULL;
69 kfree(sisusb->ibuf);
70 sisusb->ibuf = NULL;
73 static void sisusb_free_urbs(struct sisusb_usb_data *sisusb)
78 usb_free_urb(sisusb->sisurbout[i]);
79 sisusb->sisurbout[i] = NULL;
81 usb_free_urb(sisusb->sisurbin);
82 sisusb->sisurbin = NULL;
92 static int sisusb_all_free(struct sisusb_usb_data *sisusb)
96 for (i = 0; i < sisusb->numobufs; i++) {
98 if (sisusb->urbstatus[i] & SU_URB_BUSY)
107 static void sisusb_kill_all_busy(struct sisusb_usb_data *sisusb)
111 if (sisusb_all_free(sisusb))
114 for (i = 0; i < sisusb->numobufs; i++) {
116 if (sisusb->urbstatus[i] & SU_URB_BUSY)
117 usb_kill_urb(sisusb->sisurbout[i]);
123 static int sisusb_wait_all_out_complete(struct sisusb_usb_data *sisusb)
127 wait_event_timeout(sisusb->wait_q, (i = sisusb_all_free(sisusb)),
133 static int sisusb_outurb_available(struct sisusb_usb_data *sisusb)
137 for (i = 0; i < sisusb->numobufs; i++) {
139 if ((sisusb->urbstatus[i] & (SU_URB_BUSY|SU_URB_ALLOC)) == 0)
147 static int sisusb_get_free_outbuf(struct sisusb_usb_data *sisusb)
151 wait_event_timeout(sisusb->wait_q,
152 ((i = sisusb_outurb_available(sisusb)) >= 0), timeout);
157 static int sisusb_alloc_outbuf(struct sisusb_usb_data *sisusb)
161 i = sisusb_outurb_available(sisusb);
164 sisusb->urbstatus[i] |= SU_URB_ALLOC;
169 static void sisusb_free_outbuf(struct sisusb_usb_data *sisusb, int index)
171 if ((index >= 0) && (index < sisusb->numobufs))
172 sisusb->urbstatus[index] &= ~SU_URB_ALLOC;
180 struct sisusb_usb_data *sisusb;
185 sisusb = context->sisusb;
187 if (!sisusb || !sisusb->sisusb_dev || !sisusb->present)
195 sisusb->urbstatus[context->urbindex] &= ~SU_URB_BUSY;
196 wake_up(&sisusb->wait_q);
199 static int sisusb_bulkout_msg(struct sisusb_usb_data *sisusb, int index,
203 struct urb *urb = sisusb->sisurbout[index];
209 usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len,
211 &sisusb->urbout_context[index]);
217 sisusb->urbout_context[index].actual_length = (timeout) ?
221 sisusb->urbstatus[index] |= SU_URB_BUSY;
228 wait_event_timeout(sisusb->wait_q,
229 (!(sisusb->urbstatus[index] & SU_URB_BUSY)),
231 if (sisusb->urbstatus[index] & SU_URB_BUSY) {
254 struct sisusb_usb_data *sisusb = urb->context;
256 if (!sisusb || !sisusb->sisusb_dev || !sisusb->present)
259 sisusb->completein = 1;
260 wake_up(&sisusb->wait_q);
263 static int sisusb_bulkin_msg(struct sisusb_usb_data *sisusb,
267 struct urb *urb = sisusb->sisurbin;
272 usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len,
273 sisusb_bulk_completein, sisusb);
278 sisusb->completein = 0;
281 wait_event_timeout(sisusb->wait_q, sisusb->completein, timeout);
282 if (!sisusb->completein) {
307 * buffer "sisusb->obuf[index]" is set up with the data to send.
315 static int sisusb_send_bulk_msg(struct sisusb_usb_data *sisusb, int ep, int len,
329 if (!sisusb || !sisusb->present || !sisusb->sisusb_dev)
342 else if (len > sisusb->obufsize)
345 pipe = usb_sndbulkpipe(sisusb->sisusb_dev, ep);
348 passsize = thispass = (sisusb->obufsize < count) ?
349 sisusb->obufsize : count;
352 index = sisusb_get_free_outbuf(sisusb);
357 buffer = sisusb->obuf[index];
376 if (!sisusb->sisusb_dev)
379 result = sisusb_bulkout_msg(sisusb, index, pipe,
418 sisusb_wait_all_out_complete(sisusb);
436 static int sisusb_recv_bulk_msg(struct sisusb_usb_data *sisusb, int ep, int len,
448 if (!sisusb || !sisusb->present || !sisusb->sisusb_dev)
451 pipe = usb_rcvbulkpipe(sisusb->sisusb_dev, ep);
452 buffer = sisusb->ibuf;
453 bufsize = sisusb->ibufsize;
458 if (!(sisusb_wait_all_out_complete(sisusb)))
464 if (!sisusb->sisusb_dev)
469 result = sisusb_bulkin_msg(sisusb, pipe, buffer, thispass,
512 static int sisusb_send_packet(struct sisusb_usb_data *sisusb, int len,
523 if (!(sisusb_wait_all_out_complete(sisusb)))
531 ret = sisusb_send_bulk_msg(sisusb, SISUSB_EP_GFX_OUT, len,
539 ret = sisusb_recv_bulk_msg(sisusb, SISUSB_EP_GFX_IN, 4,
548 static int sisusb_send_bridge_packet(struct sisusb_usb_data *sisusb, int len,
559 if (!(sisusb_wait_all_out_complete(sisusb)))
567 ret = sisusb_send_bulk_msg(sisusb, SISUSB_EP_BRIDGE_OUT, len,
575 ret = sisusb_recv_bulk_msg(sisusb, SISUSB_EP_BRIDGE_IN, 4,
596 static int sisusb_write_memio_byte(struct sisusb_usb_data *sisusb, int type,
604 return sisusb_send_packet(sisusb, 10, &packet);
607 static int sisusb_write_memio_word(struct sisusb_usb_data *sisusb, int type,
619 ret = sisusb_send_packet(sisusb, 10, &packet);
624 ret = sisusb_send_packet(sisusb, 10, &packet);
629 ret = sisusb_send_packet(sisusb, 10, &packet);
634 ret = sisusb_send_packet(sisusb, 10, &packet);
638 ret |= sisusb_send_packet(sisusb, 10, &packet);
644 static int sisusb_write_memio_24bit(struct sisusb_usb_data *sisusb, int type,
656 ret = sisusb_send_packet(sisusb, 10, &packet);
661 ret = sisusb_send_packet(sisusb, 10, &packet);
666 ret = sisusb_send_packet(sisusb, 10, &packet);
670 ret |= sisusb_send_packet(sisusb, 10, &packet);
675 ret = sisusb_send_packet(sisusb, 10, &packet);
679 ret |= sisusb_send_packet(sisusb, 10, &packet);
685 static int sisusb_write_memio_long(struct sisusb_usb_data *sisusb, int type,
697 ret = sisusb_send_packet(sisusb, 10, &packet);
702 ret = sisusb_send_packet(sisusb, 10, &packet);
706 ret |= sisusb_send_packet(sisusb, 10, &packet);
711 ret = sisusb_send_packet(sisusb, 10, &packet);
715 ret |= sisusb_send_packet(sisusb, 10, &packet);
720 ret = sisusb_send_packet(sisusb, 10, &packet);
724 ret |= sisusb_send_packet(sisusb, 10, &packet);
737 * that the data already is in the transfer buffer "sisusb->obuf[index]".
740 static int sisusb_write_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr,
756 kernbuffer = sisusb->obuf[index];
771 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_MEM,
786 ret = sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM,
818 ret = sisusb_write_memio_24bit(sisusb, SISUSB_TYPE_MEM,
833 ret = sisusb_write_memio_long(sisusb, SISUSB_TYPE_MEM,
846 ret = sisusb_send_bridge_packet(sisusb, 10,
851 ret |= sisusb_send_bridge_packet(sisusb, 10,
856 ret |= sisusb_send_bridge_packet(sisusb, 10,
859 ret |= sisusb_send_bulk_msg(sisusb,
866 ret |= sisusb_send_bulk_msg(sisusb,
873 ret |= sisusb_send_bulk_msg(sisusb,
879 (sisusb->obufsize-1));
887 ret = sisusb_send_bridge_packet(sisusb, 10,
892 ret |= sisusb_send_bridge_packet(sisusb, 10,
894 if (sisusb->flagb0 != 0x16) {
898 ret |= sisusb_send_bridge_packet(sisusb,
900 sisusb->flagb0 = 0x16;
903 ret |= sisusb_send_bulk_msg(sisusb,
910 ret |= sisusb_send_bulk_msg(sisusb,
917 ret |= sisusb_send_bulk_msg(sisusb,
923 (sisusb->obufsize-1));
929 dev_err(&sisusb->sisusb_dev->dev,
934 dev_err(&sisusb->sisusb_dev->dev,
953 static int sisusb_read_memio_byte(struct sisusb_usb_data *sisusb, int type,
962 ret = sisusb_send_packet(sisusb, 6, &packet);
967 static int sisusb_read_memio_word(struct sisusb_usb_data *sisusb, int type,
980 ret = sisusb_send_packet(sisusb, 6, &packet);
985 ret = sisusb_send_packet(sisusb, 6, &packet);
990 ret = sisusb_send_packet(sisusb, 6, &packet);
995 ret = sisusb_send_packet(sisusb, 6, &packet);
999 ret |= sisusb_send_packet(sisusb, 6, &packet);
1006 static int sisusb_read_memio_24bit(struct sisusb_usb_data *sisusb, int type,
1017 ret = sisusb_send_packet(sisusb, 6, &packet);
1022 ret = sisusb_send_packet(sisusb, 6, &packet);
1027 ret = sisusb_send_packet(sisusb, 6, &packet);
1031 ret |= sisusb_send_packet(sisusb, 6, &packet);
1036 ret = sisusb_send_packet(sisusb, 6, &packet);
1040 ret |= sisusb_send_packet(sisusb, 6, &packet);
1047 static int sisusb_read_memio_long(struct sisusb_usb_data *sisusb, int type,
1058 ret = sisusb_send_packet(sisusb, 6, &packet);
1063 ret = sisusb_send_packet(sisusb, 6, &packet);
1067 ret |= sisusb_send_packet(sisusb, 6, &packet);
1072 ret = sisusb_send_packet(sisusb, 6, &packet);
1076 ret |= sisusb_send_packet(sisusb, 6, &packet);
1081 ret = sisusb_send_packet(sisusb, 6, &packet);
1085 ret |= sisusb_send_packet(sisusb, 6, &packet);
1092 static int sisusb_read_mem_bulk(struct sisusb_usb_data *sisusb, u32 addr,
1108 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_MEM,
1121 ret |= sisusb_read_memio_word(sisusb, SISUSB_TYPE_MEM,
1135 ret |= sisusb_read_memio_24bit(sisusb, SISUSB_TYPE_MEM,
1161 ret |= sisusb_read_memio_long(sisusb, SISUSB_TYPE_MEM,
1187 static int sisusb_setidxreg(struct sisusb_usb_data *sisusb, u32 port,
1192 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, index);
1193 ret |= sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, data);
1197 static int sisusb_getidxreg(struct sisusb_usb_data *sisusb, u32 port,
1202 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, index);
1203 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, data);
1207 static int sisusb_setidxregandor(struct sisusb_usb_data *sisusb, u32 port, u8 idx,
1213 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, idx);
1214 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, &tmp);
1217 ret |= sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, tmp);
1221 static int sisusb_setidxregmask(struct sisusb_usb_data *sisusb,
1227 ret = sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port, idx);
1228 ret |= sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, &tmp);
1231 ret |= sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, port + 1, tmp);
1235 static int sisusb_setidxregor(struct sisusb_usb_data *sisusb, u32 port,
1238 return sisusb_setidxregandor(sisusb, port, index, 0xff, myor);
1241 static int sisusb_setidxregand(struct sisusb_usb_data *sisusb, u32 port,
1244 return sisusb_setidxregandor(sisusb, port, idx, myand, 0x00);
1250 static void sisusb_testreadwrite(struct sisusb_usb_data *sisusb)
1256 sisusb_copy_memory(sisusb, srcbuffer, sisusb->vrambase, 7);
1259 dev_dbg(&sisusb->sisusb_dev->dev,
1260 "sisusb: rwtest %d bytes\n", i);
1261 sisusb_read_memory(sisusb, destbuffer, sisusb->vrambase, i);
1263 dev_dbg(&sisusb->sisusb_dev->dev,
1273 static int sisusb_write_pci_config(struct sisusb_usb_data *sisusb,
1281 return sisusb_send_packet(sisusb, 10, &packet);
1284 static int sisusb_read_pci_config(struct sisusb_usb_data *sisusb,
1292 ret = sisusb_send_packet(sisusb, 6, &packet);
1299 static int sisusb_clear_vram(struct sisusb_usb_data *sisusb,
1305 if (address < sisusb->vrambase)
1308 if (address >= sisusb->vrambase + sisusb->vramsize)
1311 if (address + length > sisusb->vrambase + sisusb->vramsize)
1312 length = sisusb->vrambase + sisusb->vramsize - address;
1318 i = sisusb_alloc_outbuf(sisusb);
1322 memset(sisusb->obuf[i], 0, sisusb->obufsize);
1327 ret = sisusb_write_mem_bulk(sisusb, address, NULL, length, NULL, i, &j);
1330 sisusb_free_outbuf(sisusb, i);
1340 #define GETREG(r, d) sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO, r, d)
1341 #define SETREG(r, d) sisusb_write_memio_byte(sisusb, SISUSB_TYPE_IO, r, d)
1342 #define SETIREG(r, i, d) sisusb_setidxreg(sisusb, r, i, d)
1343 #define GETIREG(r, i, d) sisusb_getidxreg(sisusb, r, i, d)
1344 #define SETIREGOR(r, i, o) sisusb_setidxregor(sisusb, r, i, o)
1345 #define SETIREGAND(r, i, a) sisusb_setidxregand(sisusb, r, i, a)
1346 #define SETIREGANDOR(r, i, a, o) sisusb_setidxregandor(sisusb, r, i, a, o)
1347 #define READL(a, d) sisusb_read_memio_long(sisusb, SISUSB_TYPE_MEM, a, d)
1348 #define WRITEL(a, d) sisusb_write_memio_long(sisusb, SISUSB_TYPE_MEM, a, d)
1349 #define READB(a, d) sisusb_read_memio_byte(sisusb, SISUSB_TYPE_MEM, a, d)
1350 #define WRITEB(a, d) sisusb_write_memio_byte(sisusb, SISUSB_TYPE_MEM, a, d)
1352 static int sisusb_triggersr16(struct sisusb_usb_data *sisusb, u8 ramtype)
1382 static int sisusb_getbuswidth(struct sisusb_usb_data *sisusb,
1402 ret |= sisusb_triggersr16(sisusb, ramtype);
1430 ret |= sisusb_triggersr16(sisusb, ramtype);
1466 ret |= sisusb_triggersr16(sisusb, ramtype);
1495 static int sisusb_verify_mclk(struct sisusb_usb_data *sisusb)
1523 static int sisusb_set_rank(struct sisusb_usb_data *sisusb, int *iret,
1548 ret |= sisusb_triggersr16(sisusb, 0); /* sic! */
1555 static int sisusb_check_rbc(struct sisusb_usb_data *sisusb, int *iret,
1564 ret |= WRITEL(sisusb->vrambase + j, j);
1569 ret |= READL(sisusb->vrambase + j, &tmp);
1580 static int sisusb_check_ranks(struct sisusb_usb_data *sisusb,
1591 ret |= sisusb_check_rbc(sisusb, &i2ret, inc, 2);
1597 ret |= sisusb_check_rbc(sisusb, &i2ret, inc, 4);
1602 ret |= sisusb_check_rbc(sisusb, &i2ret, inc, 2);
1610 static int sisusb_get_sdram_size(struct sisusb_usb_data *sisusb, int *iret,
1635 ret |= sisusb_set_rank(sisusb, &i2ret, i, j, chab,
1640 ret |= sisusb_check_ranks(sisusb, &i2ret, j, i, bw,
1652 static int sisusb_setup_screen(struct sisusb_usb_data *sisusb,
1661 address = sisusb->vrambase; /* Clear video ram */
1664 length = sisusb->vramsize;
1668 ret = sisusb_clear_vram(sisusb, address, length);
1672 address = sisusb->vrambase + (i * bpp);
1673 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM,
1676 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM,
1680 address = sisusb->vrambase + ((i * modex) * bpp);
1681 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM,
1684 ret |= sisusb_write_memio_word(sisusb, SISUSB_TYPE_MEM,
1692 static void sisusb_set_default_mode(struct sisusb_usb_data *sisusb,
1820 static int sisusb_init_gfxcore(struct sisusb_usb_data *sisusb)
1945 ret |= sisusb_read_pci_config(sisusb, 0x50, &tmp32);
1962 sisusb_set_default_mode(sisusb, 0);
1968 ret |= sisusb_triggersr16(sisusb, ramtype);
1974 ret |= sisusb_getbuswidth(sisusb, &bw, &chab);
1975 ret |= sisusb_verify_mclk(sisusb);
1978 ret |= sisusb_get_sdram_size(sisusb, &iret, bw, chab);
1980 dev_err(&sisusb->sisusb_dev->dev,
1986 dev_err(&sisusb->sisusb_dev->dev,
2019 static void sisusb_get_ramconfig(struct sisusb_usb_data *sisusb)
2030 sisusb_getidxreg(sisusb, SISSR, 0x14, &tmp8);
2031 sisusb_getidxreg(sisusb, SISSR, 0x15, &tmp82);
2032 sisusb_getidxreg(sisusb, SISSR, 0x3a, &ramtype);
2033 sisusb->vramsize = (1 << ((tmp8 & 0xf0) >> 4)) * 1024 * 1024;
2046 sisusb->vramsize <<= 1;
2051 sisusb->vramsize += sisusb->vramsize/2;
2056 sisusb->vramsize <<= 1;
2061 dev_info(&sisusb->sisusb_dev->dev,
2063 sisusb->vramsize >> 20, ramtypetext1,
2067 static int sisusb_do_init_gfxdevice(struct sisusb_usb_data *sisusb)
2077 ret = sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2082 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2087 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2092 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2096 ret |= sisusb_send_bridge_packet(sisusb, 6, &packet, 0);
2098 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2101 ret |= sisusb_read_pci_config(sisusb, 0x10, &tmp32);
2102 ret |= sisusb_write_pci_config(sisusb, 0x10, 0xfffffff0);
2103 ret |= sisusb_read_pci_config(sisusb, 0x10, &tmp32);
2106 ret |= sisusb_write_pci_config(sisusb, 0x10, tmp32);
2109 ret |= sisusb_read_pci_config(sisusb, 0x14, &tmp32);
2110 ret |= sisusb_write_pci_config(sisusb, 0x14, 0xfffffff0);
2111 ret |= sisusb_read_pci_config(sisusb, 0x14, &tmp32);
2114 ret |= sisusb_write_pci_config(sisusb, 0x14, tmp32);
2117 ret |= sisusb_read_pci_config(sisusb, 0x18, &tmp32);
2118 ret |= sisusb_write_pci_config(sisusb, 0x18, 0xfffffff0);
2119 ret |= sisusb_read_pci_config(sisusb, 0x18, &tmp32);
2122 ret |= sisusb_write_pci_config(sisusb, 0x18, tmp32);
2125 ret |= sisusb_read_pci_config(sisusb, 0x04, &tmp32);
2127 ret |= sisusb_write_pci_config(sisusb, 0x04, tmp32);
2134 ret |= sisusb_send_bridge_packet(sisusb, 10, &packet, 0);
2145 static int sisusb_init_gfxdevice(struct sisusb_usb_data *sisusb, int initscreen)
2150 if (sisusb->devinit == 1) {
2152 ret |= sisusb_read_pci_config(sisusb, 0x10, &tmp32);
2159 ret |= sisusb_read_pci_config(sisusb, 0x14, &tmp32);
2166 ret |= sisusb_read_pci_config(sisusb, 0x18, &tmp32);
2175 if ((sisusb->devinit == 0) || (test != 3)) {
2177 ret |= sisusb_do_init_gfxdevice(sisusb);
2180 sisusb->devinit = 1;
2184 if (sisusb->devinit) {
2186 if (sisusb_init_gfxcore(sisusb) == 0) {
2187 sisusb->gfxinit = 1;
2188 sisusb_get_ramconfig(sisusb);
2189 sisusb_set_default_mode(sisusb, 1);
2190 ret |= sisusb_setup_screen(sisusb, 1, initscreen);
2201 struct sisusb_usb_data *sisusb;
2209 sisusb = usb_get_intfdata(interface);
2210 if (!sisusb)
2213 mutex_lock(&sisusb->lock);
2215 if (!sisusb->present || !sisusb->ready) {
2216 mutex_unlock(&sisusb->lock);
2220 if (sisusb->isopen) {
2221 mutex_unlock(&sisusb->lock);
2225 if (!sisusb->devinit) {
2226 if (sisusb->sisusb_dev->speed == USB_SPEED_HIGH ||
2227 sisusb->sisusb_dev->speed >= USB_SPEED_SUPER) {
2228 if (sisusb_init_gfxdevice(sisusb, 0)) {
2229 mutex_unlock(&sisusb->lock);
2230 dev_err(&sisusb->sisusb_dev->dev,
2235 mutex_unlock(&sisusb->lock);
2236 dev_err(&sisusb->sisusb_dev->dev,
2242 /* Increment usage count for our sisusb */
2243 kref_get(&sisusb->kref);
2245 sisusb->isopen = 1;
2247 file->private_data = sisusb;
2249 mutex_unlock(&sisusb->lock);
2256 struct sisusb_usb_data *sisusb = to_sisusb_dev(kref);
2258 if (!sisusb)
2261 usb_put_dev(sisusb->sisusb_dev);
2263 sisusb->sisusb_dev = NULL;
2264 sisusb_free_buffers(sisusb);
2265 sisusb_free_urbs(sisusb);
2266 kfree(sisusb);
2271 struct sisusb_usb_data *sisusb;
2273 sisusb = file->private_data;
2274 if (!sisusb)
2277 mutex_lock(&sisusb->lock);
2279 if (sisusb->present) {
2281 if (!sisusb_wait_all_out_complete(sisusb))
2282 sisusb_kill_all_busy(sisusb);
2285 sisusb->isopen = 0;
2288 mutex_unlock(&sisusb->lock);
2291 kref_put(&sisusb->kref, sisusb_delete);
2299 struct sisusb_usb_data *sisusb;
2306 sisusb = file->private_data;
2307 if (!sisusb)
2310 mutex_lock(&sisusb->lock);
2313 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
2314 mutex_unlock(&sisusb->lock);
2331 if (sisusb_read_memio_byte(sisusb, SISUSB_TYPE_IO,
2342 if (sisusb_read_memio_word(sisusb, SISUSB_TYPE_IO,
2353 if (sisusb_read_memio_long(sisusb, SISUSB_TYPE_IO,
2369 SISUSB_PCI_PSEUDO_MEMBASE + sisusb->vramsize) {
2377 errno = sisusb_read_mem_bulk(sisusb, address,
2393 errno = sisusb_read_mem_bulk(sisusb, address,
2403 mutex_unlock(&sisusb->lock);
2412 if (sisusb_read_pci_config(sisusb, address, &buf32))
2427 mutex_unlock(&sisusb->lock);
2435 struct sisusb_usb_data *sisusb;
2442 sisusb = file->private_data;
2443 if (!sisusb)
2446 mutex_lock(&sisusb->lock);
2449 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
2450 mutex_unlock(&sisusb->lock);
2469 else if (sisusb_write_memio_byte(sisusb,
2480 else if (sisusb_write_memio_word(sisusb,
2491 else if (sisusb_write_memio_long(sisusb,
2505 sisusb->vramsize) {
2516 errno = sisusb_write_mem_bulk(sisusb, address, NULL,
2534 errno = sisusb_write_mem_bulk(sisusb, address, NULL,
2545 mutex_unlock(&sisusb->lock);
2556 else if (sisusb_write_pci_config(sisusb, address, buf32))
2571 mutex_unlock(&sisusb->lock);
2578 struct sisusb_usb_data *sisusb;
2581 sisusb = file->private_data;
2582 if (!sisusb)
2585 mutex_lock(&sisusb->lock);
2588 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
2589 mutex_unlock(&sisusb->lock);
2595 mutex_unlock(&sisusb->lock);
2599 static int sisusb_handle_command(struct sisusb_usb_data *sisusb,
2608 if (!sisusb->devinit)
2617 retval = sisusb_getidxreg(sisusb, port, y->data0, &y->data1);
2625 retval = sisusb_setidxreg(sisusb, port, y->data0, y->data1);
2629 retval = sisusb_setidxregor(sisusb, port, y->data0, y->data1);
2633 retval = sisusb_setidxregand(sisusb, port, y->data0, y->data1);
2637 retval = sisusb_setidxregandor(sisusb, port, y->data0,
2642 retval = sisusb_setidxregmask(sisusb, port, y->data0,
2648 if (!sisusb->gfxinit)
2654 retval = sisusb_clear_vram(sisusb, address, length);
2673 struct sisusb_usb_data *sisusb;
2679 sisusb = file->private_data;
2680 if (!sisusb)
2683 mutex_lock(&sisusb->lock);
2686 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) {
2705 x.sisusb_gfxinit = sisusb->gfxinit;
2710 x.sisusb_vramsize = sisusb->vramsize;
2711 x.sisusb_minor = sisusb->minor;
2726 retval = sisusb_handle_command(sisusb, &y, arg);
2736 mutex_unlock(&sisusb->lock);
2779 struct sisusb_usb_data *sisusb;
2800 sisusb = kzalloc(sizeof(*sisusb), GFP_KERNEL);
2801 if (!sisusb)
2804 kref_init(&sisusb->kref);
2806 mutex_init(&(sisusb->lock));
2808 sisusb->sisusb_dev = dev;
2809 sisusb->vrambase = SISUSB_PCI_MEMBASE;
2810 sisusb->mmiobase = SISUSB_PCI_MMIOBASE;
2811 sisusb->mmiosize = SISUSB_PCI_MMIOSIZE;
2812 sisusb->ioportbase = SISUSB_PCI_IOPORTBASE;
2818 dev_err(&sisusb->sisusb_dev->dev,
2825 sisusb->minor = intf->minor;
2828 sisusb->ibufsize = SISUSB_IBUF_SIZE;
2829 sisusb->ibuf = kmalloc(SISUSB_IBUF_SIZE, GFP_KERNEL);
2830 if (!sisusb->ibuf) {
2835 sisusb->numobufs = 0;
2836 sisusb->obufsize = SISUSB_OBUF_SIZE;
2838 sisusb->obuf[i] = kmalloc(SISUSB_OBUF_SIZE, GFP_KERNEL);
2839 if (!sisusb->obuf[i]) {
2846 sisusb->numobufs++;
2850 sisusb->sisurbin = usb_alloc_urb(0, GFP_KERNEL);
2851 if (!sisusb->sisurbin) {
2855 sisusb->completein = 1;
2857 for (i = 0; i < sisusb->numobufs; i++) {
2858 sisusb->sisurbout[i] = usb_alloc_urb(0, GFP_KERNEL);
2859 if (!sisusb->sisurbout[i]) {
2863 sisusb->urbout_context[i].sisusb = (void *)sisusb;
2864 sisusb->urbout_context[i].urbindex = i;
2865 sisusb->urbstatus[i] = 0;
2868 dev_info(&sisusb->sisusb_dev->dev, "Allocated %d output buffers\n",
2869 sisusb->numobufs);
2873 init_waitqueue_head(&sisusb->wait_q);
2875 usb_set_intfdata(intf, sisusb);
2877 usb_get_dev(sisusb->sisusb_dev);
2879 sisusb->present = 1;
2883 if (sisusb_init_gfxdevice(sisusb, initscreen))
2884 dev_err(&sisusb->sisusb_dev->dev,
2888 dev_info(&sisusb->sisusb_dev->dev,
2891 sisusb->ready = 1;
2894 dev_dbg(&sisusb->sisusb_dev->dev, "*** RWTEST ***\n");
2895 sisusb_testreadwrite(sisusb);
2896 dev_dbg(&sisusb->sisusb_dev->dev, "*** RWTEST END ***\n");
2902 sisusb_free_urbs(sisusb);
2904 sisusb_free_buffers(sisusb);
2908 kfree(sisusb);
2914 struct sisusb_usb_data *sisusb;
2917 sisusb = usb_get_intfdata(intf);
2918 if (!sisusb)
2923 mutex_lock(&sisusb->lock);
2926 if (!sisusb_wait_all_out_complete(sisusb))
2927 sisusb_kill_all_busy(sisusb);
2931 sisusb->present = 0;
2932 sisusb->ready = 0;
2934 mutex_unlock(&sisusb->lock);
2937 kref_put(&sisusb->kref, sisusb_delete);
2958 .name = "sisusb",