Lines Matching +full:display +full:- +full:width +full:- +full:chars

1 // SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
3 * sisusb - usb kernel driver for SiS315(E) based USB2VGA dongles
62 /* Forward declarations / clean-up routines */
69 MODULE_PARM_DESC(first, "Number of first console to take over (1 - MAX_NR_CONSOLES)");
70 MODULE_PARM_DESC(last, "Number of last console to take over (1 - MAX_NR_CONSOLES)");
80 kfree(sisusb->obuf[i]); in sisusb_free_buffers()
81 sisusb->obuf[i] = NULL; in sisusb_free_buffers()
83 kfree(sisusb->ibuf); in sisusb_free_buffers()
84 sisusb->ibuf = NULL; in sisusb_free_buffers()
92 usb_free_urb(sisusb->sisurbout[i]); in sisusb_free_urbs()
93 sisusb->sisurbout[i] = NULL; in sisusb_free_urbs()
95 usb_free_urb(sisusb->sisurbin); in sisusb_free_urbs()
96 sisusb->sisurbin = NULL; in sisusb_free_urbs()
101 /* 1. out-bulks */
103 /* out-urb management */
110 for (i = 0; i < sisusb->numobufs; i++) { in sisusb_all_free()
112 if (sisusb->urbstatus[i] & SU_URB_BUSY) in sisusb_all_free()
128 for (i = 0; i < sisusb->numobufs; i++) { in sisusb_kill_all_busy()
130 if (sisusb->urbstatus[i] & SU_URB_BUSY) in sisusb_kill_all_busy()
131 usb_kill_urb(sisusb->sisurbout[i]); in sisusb_kill_all_busy()
141 wait_event_timeout(sisusb->wait_q, (i = sisusb_all_free(sisusb)), in sisusb_wait_all_out_complete()
151 for (i = 0; i < sisusb->numobufs; i++) { in sisusb_outurb_available()
153 if ((sisusb->urbstatus[i] & (SU_URB_BUSY|SU_URB_ALLOC)) == 0) in sisusb_outurb_available()
158 return -1; in sisusb_outurb_available()
165 wait_event_timeout(sisusb->wait_q, in sisusb_get_free_outbuf()
178 sisusb->urbstatus[i] |= SU_URB_ALLOC; in sisusb_alloc_outbuf()
185 if ((index >= 0) && (index < sisusb->numobufs)) in sisusb_free_outbuf()
186 sisusb->urbstatus[index] &= ~SU_URB_ALLOC; in sisusb_free_outbuf()
193 struct sisusb_urb_context *context = urb->context; in sisusb_bulk_completeout()
199 sisusb = context->sisusb; in sisusb_bulk_completeout()
201 if (!sisusb || !sisusb->sisusb_dev || !sisusb->present) in sisusb_bulk_completeout()
205 if (context->actual_length) in sisusb_bulk_completeout()
206 *(context->actual_length) += urb->actual_length; in sisusb_bulk_completeout()
209 sisusb->urbstatus[context->urbindex] &= ~SU_URB_BUSY; in sisusb_bulk_completeout()
210 wake_up(&sisusb->wait_q); in sisusb_bulk_completeout()
217 struct urb *urb = sisusb->sisurbout[index]; in sisusb_bulkout_msg()
221 urb->transfer_flags = 0; in sisusb_bulkout_msg()
223 usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len, in sisusb_bulkout_msg()
225 &sisusb->urbout_context[index]); in sisusb_bulkout_msg()
227 urb->transfer_flags |= tflags; in sisusb_bulkout_msg()
228 urb->actual_length = 0; in sisusb_bulkout_msg()
231 sisusb->urbout_context[index].actual_length = (timeout) ? in sisusb_bulkout_msg()
235 sisusb->urbstatus[index] |= SU_URB_BUSY; in sisusb_bulkout_msg()
242 wait_event_timeout(sisusb->wait_q, in sisusb_bulkout_msg()
243 (!(sisusb->urbstatus[index] & SU_URB_BUSY)), in sisusb_bulkout_msg()
245 if (sisusb->urbstatus[index] & SU_URB_BUSY) { in sisusb_bulkout_msg()
248 retval = -ETIMEDOUT; in sisusb_bulkout_msg()
251 retval = urb->status; in sisusb_bulkout_msg()
252 byteswritten = urb->actual_length; in sisusb_bulkout_msg()
262 /* 2. in-bulks */
268 struct sisusb_usb_data *sisusb = urb->context; in sisusb_bulk_completein()
270 if (!sisusb || !sisusb->sisusb_dev || !sisusb->present) in sisusb_bulk_completein()
273 sisusb->completein = 1; in sisusb_bulk_completein()
274 wake_up(&sisusb->wait_q); in sisusb_bulk_completein()
281 struct urb *urb = sisusb->sisurbin; in sisusb_bulkin_msg()
284 urb->transfer_flags = 0; in sisusb_bulkin_msg()
286 usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len, in sisusb_bulkin_msg()
289 urb->transfer_flags |= tflags; in sisusb_bulkin_msg()
290 urb->actual_length = 0; in sisusb_bulkin_msg()
292 sisusb->completein = 0; in sisusb_bulkin_msg()
295 wait_event_timeout(sisusb->wait_q, sisusb->completein, timeout); in sisusb_bulkin_msg()
296 if (!sisusb->completein) { in sisusb_bulkin_msg()
299 retval = -ETIMEDOUT; in sisusb_bulkin_msg()
302 retval = urb->status; in sisusb_bulkin_msg()
303 readbytes = urb->actual_length; in sisusb_bulkin_msg()
319 * to copy from (non-DMA) kernel memory, give "kernbuffer". If
321 * buffer "sisusb->obuf[index]" is set up with the data to send.
343 if (!sisusb || !sisusb->present || !sisusb->sisusb_dev) in sisusb_send_bulk_msg()
344 return -ENODEV; in sisusb_send_bulk_msg()
355 index = -1; in sisusb_send_bulk_msg()
356 else if (len > sisusb->obufsize) in sisusb_send_bulk_msg()
359 pipe = usb_sndbulkpipe(sisusb->sisusb_dev, ep); in sisusb_send_bulk_msg()
362 passsize = thispass = (sisusb->obufsize < count) ? in sisusb_send_bulk_msg()
363 sisusb->obufsize : count; in sisusb_send_bulk_msg()
369 return -EIO; in sisusb_send_bulk_msg()
371 buffer = sisusb->obuf[index]; in sisusb_send_bulk_msg()
376 return -EFAULT; in sisusb_send_bulk_msg()
390 if (!sisusb->sisusb_dev) in sisusb_send_bulk_msg()
391 return -ENODEV; in sisusb_send_bulk_msg()
397 if (result == -ETIMEDOUT) { in sisusb_send_bulk_msg()
400 if (!retry--) in sisusb_send_bulk_msg()
401 return -ETIME; in sisusb_send_bulk_msg()
408 thispass -= transferred_len; in sisusb_send_bulk_msg()
419 count -= passsize; in sisusb_send_bulk_msg()
423 index = -1; in sisusb_send_bulk_msg()
438 return ((*bytes_written) == len) ? 0 : -EIO; in sisusb_send_bulk_msg()
462 if (!sisusb || !sisusb->present || !sisusb->sisusb_dev) in sisusb_recv_bulk_msg()
463 return -ENODEV; in sisusb_recv_bulk_msg()
465 pipe = usb_rcvbulkpipe(sisusb->sisusb_dev, ep); in sisusb_recv_bulk_msg()
466 buffer = sisusb->ibuf; in sisusb_recv_bulk_msg()
467 bufsize = sisusb->ibufsize; in sisusb_recv_bulk_msg()
473 return -EIO; in sisusb_recv_bulk_msg()
478 if (!sisusb->sisusb_dev) in sisusb_recv_bulk_msg()
479 return -ENODEV; in sisusb_recv_bulk_msg()
489 else if (result == -ETIMEDOUT) { in sisusb_recv_bulk_msg()
491 if (!retry--) in sisusb_recv_bulk_msg()
492 return -ETIME; in sisusb_recv_bulk_msg()
497 return -EIO; in sisusb_recv_bulk_msg()
503 count -= thispass; in sisusb_recv_bulk_msg()
508 return -EFAULT; in sisusb_recv_bulk_msg()
523 return ((*bytes_read) == len) ? 0 : -EIO; in sisusb_recv_bulk_msg()
534 packet->data = 0; in sisusb_send_packet()
551 * return value and write it to packet->data in sisusb_send_packet()
556 packet->data = le32_to_cpu(tmp); in sisusb_send_packet()
570 packet->data = 0; in sisusb_send_bridge_packet()
587 * return value and write it to packet->data in sisusb_send_bridge_packet()
592 packet->data = le32_to_cpu(tmp); in sisusb_send_bridge_packet()
605 * - the write routines expect "data" in machine endianness format.
607 * - the read routines can expect read data in machine-endianess.
745 * buffer as chars, therefore lsb/msb has to be corrected if using the
746 * byte/word/long/etc routines for speed-up
751 * that the data already is in the transfer buffer "sisusb->obuf[index]".
770 kernbuffer = sisusb->obuf[index]; in sisusb_write_mem_bulk()
781 return -EFAULT; in sisusb_write_mem_bulk()
796 return -EFAULT; in sisusb_write_mem_bulk()
811 return -EFAULT; in sisusb_write_mem_bulk()
843 return -EFAULT; in sisusb_write_mem_bulk()
893 (sisusb->obufsize-1)); in sisusb_write_mem_bulk()
908 if (sisusb->flagb0 != 0x16) { in sisusb_write_mem_bulk()
914 sisusb->flagb0 = 0x16; in sisusb_write_mem_bulk()
937 (sisusb->obufsize-1)); in sisusb_write_mem_bulk()
943 dev_err(&sisusb->sisusb_dev->dev, in sisusb_write_mem_bulk()
948 dev_err(&sisusb->sisusb_dev->dev, in sisusb_write_mem_bulk()
952 length -= (*bytes_written); in sisusb_write_mem_bulk()
960 return ret ? -EIO : 0; in sisusb_write_mem_bulk()
963 /* Remember: Read data in packet is in machine-endianess! So for
1128 return -EFAULT; in sisusb_read_mem_bulk()
1141 return -EFAULT; in sisusb_read_mem_bulk()
1165 return -EFAULT; in sisusb_read_mem_bulk()
1181 return -EFAULT; in sisusb_read_mem_bulk()
1189 length -= 4; in sisusb_read_mem_bulk()
1314 sisusb_copy_memory(sisusb, srcbuffer, sisusb->vrambase, 7); in sisusb_testreadwrite()
1317 dev_dbg(&sisusb->sisusb_dev->dev, in sisusb_testreadwrite()
1319 sisusb_read_memory(sisusb, destbuffer, sisusb->vrambase, i); in sisusb_testreadwrite()
1321 dev_dbg(&sisusb->sisusb_dev->dev, in sisusb_testreadwrite()
1363 if (address < sisusb->vrambase) in sisusb_clear_vram()
1366 if (address >= sisusb->vrambase + sisusb->vramsize) in sisusb_clear_vram()
1369 if (address + length > sisusb->vrambase + sisusb->vramsize) in sisusb_clear_vram()
1370 length = sisusb->vrambase + sisusb->vramsize - address; in sisusb_clear_vram()
1378 return -EBUSY; in sisusb_clear_vram()
1380 memset(sisusb->obuf[i], 0, sisusb->obufsize); in sisusb_clear_vram()
1383 * data will simply be re-used (like a ring-buffer). in sisusb_clear_vram()
1601 tmp |= ((rankno - 1) << 2); in sisusb_set_rank()
1622 ret |= WRITEL(sisusb->vrambase + j, j); in sisusb_check_rbc()
1627 ret |= READL(sisusb->vrambase + j, &tmp); in sisusb_check_rbc()
1646 for (i = rankno; i >= 1; i--) { in sisusb_check_ranks()
1692 for (j = 2; j > 0; j--) { in sisusb_get_sdram_size()
1719 address = sisusb->vrambase; /* Clear video ram */ in sisusb_setup_screen()
1722 length = sisusb->vramsize; in sisusb_setup_screen()
1730 address = sisusb->vrambase + (i * bpp); in sisusb_setup_screen()
1733 address += (modex * (modey-1) * bpp); in sisusb_setup_screen()
1738 address = sisusb->vrambase + ((i * modex) * bpp); in sisusb_setup_screen()
1741 address += ((modex - 1) * bpp); in sisusb_setup_screen()
1862 SETIREGAND(SISSR, 0x01, 0xdf); /* enable display */ in sisusb_set_default_mode()
1912 while (retry--) { in sisusb_init_gfxcore()
2038 dev_err(&sisusb->sisusb_dev->dev, in sisusb_init_gfxcore()
2044 dev_err(&sisusb->sisusb_dev->dev, in sisusb_init_gfxcore()
2091 sisusb->vramsize = (1 << ((tmp8 & 0xf0) >> 4)) * 1024 * 1024; in sisusb_get_ramconfig()
2104 sisusb->vramsize <<= 1; in sisusb_get_ramconfig()
2109 sisusb->vramsize += sisusb->vramsize/2; in sisusb_get_ramconfig()
2114 sisusb->vramsize <<= 1; in sisusb_get_ramconfig()
2119 dev_info(&sisusb->sisusb_dev->dev, in sisusb_get_ramconfig()
2120 "%dMB %s %cDR S%cRAM, bus width %d\n", in sisusb_get_ramconfig()
2121 sisusb->vramsize >> 20, ramtypetext1, in sisusb_get_ramconfig()
2208 if (sisusb->devinit == 1) { in sisusb_init_gfxdevice()
2233 if ((sisusb->devinit == 0) || (test != 3)) { in sisusb_init_gfxdevice()
2238 sisusb->devinit = 1; in sisusb_init_gfxdevice()
2242 if (sisusb->devinit) { in sisusb_init_gfxdevice()
2245 sisusb->gfxinit = 1; in sisusb_init_gfxdevice()
2259 * - Set text mode (0x03)
2260 * - Upload default font
2261 * - Upload user font (if available)
2266 int ret = 0, slot = sisusb->font_slot, i; in sisusb_reset_text_mode()
2274 /* sisusb->lock is down */ in sisusb_reset_text_mode()
2276 if (!sisusb->SiS_Pr) in sisusb_reset_text_mode()
2279 sisusb->SiS_Pr->IOAddress = SISUSB_PCI_IOPORTBASE + 0x30; in sisusb_reset_text_mode()
2280 sisusb->SiS_Pr->sisusb = (void *)sisusb; in sisusb_reset_text_mode()
2283 SiSUSBSetMode(sisusb->SiS_Pr, 0x03); in sisusb_reset_text_mode()
2294 memcpy(tempbuf + (i * 32), myfont->data + (i * 16), 16); in sisusb_reset_text_mode()
2303 if (sisusb->font_backup) { in sisusb_reset_text_mode()
2304 ret |= sisusbcon_do_font_op(sisusb, 1, 2, sisusb->font_backup, in sisusb_reset_text_mode()
2305 8192, sisusb->font_backup_512, 1, NULL, in sisusb_reset_text_mode()
2306 sisusb->font_backup_height, 0); in sisusb_reset_text_mode()
2312 if (init && !sisusb->scrbuf) { in sisusb_reset_text_mode()
2319 while (i--) in sisusb_reset_text_mode()
2336 sisusb->vrambase, 8192); in sisusb_reset_text_mode()
2342 } else if (sisusb->scrbuf) { in sisusb_reset_text_mode()
2343 ret |= sisusb_copy_memory(sisusb, (u8 *)sisusb->scrbuf, in sisusb_reset_text_mode()
2344 sisusb->vrambase, sisusb->scrbuf_size); in sisusb_reset_text_mode()
2347 if (sisusb->sisusb_cursor_size_from >= 0 && in sisusb_reset_text_mode()
2348 sisusb->sisusb_cursor_size_to >= 0) { in sisusb_reset_text_mode()
2350 sisusb->sisusb_cursor_size_from); in sisusb_reset_text_mode()
2352 sisusb->sisusb_cursor_size_to); in sisusb_reset_text_mode()
2356 sisusb->sisusb_cursor_size_to = -1; in sisusb_reset_text_mode()
2359 slot = sisusb->sisusb_cursor_loc; in sisusb_reset_text_mode()
2363 sisusb->sisusb_cursor_loc = -1; in sisusb_reset_text_mode()
2364 sisusb->bad_cursor_pos = 1; in sisusb_reset_text_mode()
2368 sisusb_setidxreg(sisusb, SISCR, 0x0c, (sisusb->cur_start_addr >> 8)); in sisusb_reset_text_mode()
2369 sisusb_setidxreg(sisusb, SISCR, 0x0d, (sisusb->cur_start_addr & 0xff)); in sisusb_reset_text_mode()
2371 sisusb->textmodedestroyed = 0; in sisusb_reset_text_mode()
2373 /* sisusb->lock is down */ in sisusb_reset_text_mode()
2390 return -ENODEV; in sisusb_open()
2394 return -ENODEV; in sisusb_open()
2396 mutex_lock(&sisusb->lock); in sisusb_open()
2398 if (!sisusb->present || !sisusb->ready) { in sisusb_open()
2399 mutex_unlock(&sisusb->lock); in sisusb_open()
2400 return -ENODEV; in sisusb_open()
2403 if (sisusb->isopen) { in sisusb_open()
2404 mutex_unlock(&sisusb->lock); in sisusb_open()
2405 return -EBUSY; in sisusb_open()
2408 if (!sisusb->devinit) { in sisusb_open()
2409 if (sisusb->sisusb_dev->speed == USB_SPEED_HIGH || in sisusb_open()
2410 sisusb->sisusb_dev->speed >= USB_SPEED_SUPER) { in sisusb_open()
2412 mutex_unlock(&sisusb->lock); in sisusb_open()
2413 dev_err(&sisusb->sisusb_dev->dev, in sisusb_open()
2415 return -EIO; in sisusb_open()
2418 mutex_unlock(&sisusb->lock); in sisusb_open()
2419 dev_err(&sisusb->sisusb_dev->dev, in sisusb_open()
2421 return -EIO; in sisusb_open()
2426 kref_get(&sisusb->kref); in sisusb_open()
2428 sisusb->isopen = 1; in sisusb_open()
2430 file->private_data = sisusb; in sisusb_open()
2432 mutex_unlock(&sisusb->lock); in sisusb_open()
2444 usb_put_dev(sisusb->sisusb_dev); in sisusb_delete()
2446 sisusb->sisusb_dev = NULL; in sisusb_delete()
2450 kfree(sisusb->SiS_Pr); in sisusb_delete()
2459 sisusb = file->private_data; in sisusb_release()
2461 return -ENODEV; in sisusb_release()
2463 mutex_lock(&sisusb->lock); in sisusb_release()
2465 if (sisusb->present) { in sisusb_release()
2471 sisusb->isopen = 0; in sisusb_release()
2472 file->private_data = NULL; in sisusb_release()
2474 mutex_unlock(&sisusb->lock); in sisusb_release()
2477 kref_put(&sisusb->kref, sisusb_delete); in sisusb_release()
2492 sisusb = file->private_data; in sisusb_read()
2494 return -ENODEV; in sisusb_read()
2496 mutex_lock(&sisusb->lock); in sisusb_read()
2499 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) { in sisusb_read()
2500 mutex_unlock(&sisusb->lock); in sisusb_read()
2501 return -ENODEV; in sisusb_read()
2507 address = (*ppos) - SISUSB_PCI_PSEUDO_IOPORTBASE + in sisusb_read()
2513 * in machine-endianness. in sisusb_read()
2519 errno = -EIO; in sisusb_read()
2521 errno = -EFAULT; in sisusb_read()
2530 errno = -EIO; in sisusb_read()
2532 errno = -EFAULT; in sisusb_read()
2541 errno = -EIO; in sisusb_read()
2543 errno = -EFAULT; in sisusb_read()
2550 errno = -EIO; in sisusb_read()
2555 SISUSB_PCI_PSEUDO_MEMBASE + sisusb->vramsize) { in sisusb_read()
2557 address = (*ppos) - SISUSB_PCI_PSEUDO_MEMBASE + in sisusb_read()
2561 * Remember: Data delivered is never endian-corrected in sisusb_read()
2573 address = (*ppos) - SISUSB_PCI_PSEUDO_MMIOBASE + in sisusb_read()
2577 * Remember: Data delivered is never endian-corrected in sisusb_read()
2589 mutex_unlock(&sisusb->lock); in sisusb_read()
2590 return -EINVAL; in sisusb_read()
2593 address = (*ppos) - SISUSB_PCI_PSEUDO_PCIBASE; in sisusb_read()
2599 errno = -EIO; in sisusb_read()
2601 errno = -EFAULT; in sisusb_read()
2607 errno = -EBADFD; in sisusb_read()
2613 mutex_unlock(&sisusb->lock); in sisusb_read()
2628 sisusb = file->private_data; in sisusb_write()
2630 return -ENODEV; in sisusb_write()
2632 mutex_lock(&sisusb->lock); in sisusb_write()
2635 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) { in sisusb_write()
2636 mutex_unlock(&sisusb->lock); in sisusb_write()
2637 return -ENODEV; in sisusb_write()
2643 address = (*ppos) - SISUSB_PCI_PSEUDO_IOPORTBASE + in sisusb_write()
2649 * in machine-endianness. in sisusb_write()
2654 errno = -EFAULT; in sisusb_write()
2657 errno = -EIO; in sisusb_write()
2665 errno = -EFAULT; in sisusb_write()
2668 errno = -EIO; in sisusb_write()
2676 errno = -EFAULT; in sisusb_write()
2679 errno = -EIO; in sisusb_write()
2686 errno = -EIO; in sisusb_write()
2691 sisusb->vramsize) { in sisusb_write()
2693 address = (*ppos) - SISUSB_PCI_PSEUDO_MEMBASE + in sisusb_write()
2697 * Buffer is copied 1:1, therefore, on big-endian in sisusb_write()
2712 address = (*ppos) - SISUSB_PCI_PSEUDO_MMIOBASE + in sisusb_write()
2716 * Buffer is copied 1:1, therefore, on big-endian in sisusb_write()
2731 mutex_unlock(&sisusb->lock); in sisusb_write()
2732 return -EINVAL; in sisusb_write()
2735 address = (*ppos) - SISUSB_PCI_PSEUDO_PCIBASE; in sisusb_write()
2741 errno = -EFAULT; in sisusb_write()
2743 errno = -EIO; in sisusb_write()
2751 errno = -EBADFD; in sisusb_write()
2757 mutex_unlock(&sisusb->lock); in sisusb_write()
2767 sisusb = file->private_data; in sisusb_lseek()
2769 return -ENODEV; in sisusb_lseek()
2771 mutex_lock(&sisusb->lock); in sisusb_lseek()
2774 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) { in sisusb_lseek()
2775 mutex_unlock(&sisusb->lock); in sisusb_lseek()
2776 return -ENODEV; in sisusb_lseek()
2781 mutex_unlock(&sisusb->lock); in sisusb_lseek()
2794 if (!sisusb->devinit) in sisusb_handle_command()
2795 return -ENODEV; in sisusb_handle_command()
2797 port = y->data3 - in sisusb_handle_command()
2801 switch (y->operation) { in sisusb_handle_command()
2803 retval = sisusb_getidxreg(sisusb, port, y->data0, &y->data1); in sisusb_handle_command()
2806 retval = -EFAULT; in sisusb_handle_command()
2811 retval = sisusb_setidxreg(sisusb, port, y->data0, y->data1); in sisusb_handle_command()
2815 retval = sisusb_setidxregor(sisusb, port, y->data0, y->data1); in sisusb_handle_command()
2819 retval = sisusb_setidxregand(sisusb, port, y->data0, y->data1); in sisusb_handle_command()
2823 retval = sisusb_setidxregandor(sisusb, port, y->data0, in sisusb_handle_command()
2824 y->data1, y->data2); in sisusb_handle_command()
2828 retval = sisusb_setidxregmask(sisusb, port, y->data0, in sisusb_handle_command()
2829 y->data1, y->data2); in sisusb_handle_command()
2834 if (!sisusb->gfxinit) in sisusb_handle_command()
2835 return -ENODEV; in sisusb_handle_command()
2837 length = (y->data0 << 16) | (y->data1 << 8) | y->data2; in sisusb_handle_command()
2838 address = y->data3 - SISUSB_PCI_PSEUDO_MEMBASE + in sisusb_handle_command()
2847 if (!sisusb->gfxinit || !sisusb->SiS_Pr) in sisusb_handle_command()
2848 return -ENODEV; in sisusb_handle_command()
2850 switch (y->data0) { in sisusb_handle_command()
2855 sisusb->textmodedestroyed = 1; in sisusb_handle_command()
2864 if (!sisusb->gfxinit || !sisusb->SiS_Pr) in sisusb_handle_command()
2865 return -ENODEV; in sisusb_handle_command()
2869 sisusb->SiS_Pr->IOAddress = SISUSB_PCI_IOPORTBASE + 0x30; in sisusb_handle_command()
2870 sisusb->SiS_Pr->sisusb = (void *)sisusb; in sisusb_handle_command()
2872 if (SiSUSBSetMode(sisusb->SiS_Pr, y->data3)) in sisusb_handle_command()
2873 retval = -EINVAL; in sisusb_handle_command()
2879 if (!sisusb->gfxinit || !sisusb->SiS_Pr) in sisusb_handle_command()
2880 return -ENODEV; in sisusb_handle_command()
2884 sisusb->SiS_Pr->IOAddress = SISUSB_PCI_IOPORTBASE + 0x30; in sisusb_handle_command()
2885 sisusb->SiS_Pr->sisusb = (void *)sisusb; in sisusb_handle_command()
2887 if (SiSUSBSetVESAMode(sisusb->SiS_Pr, y->data3)) in sisusb_handle_command()
2888 retval = -EINVAL; in sisusb_handle_command()
2894 retval = -EINVAL; in sisusb_handle_command()
2898 retval = -EIO; in sisusb_handle_command()
2911 sisusb = file->private_data; in sisusb_ioctl()
2913 return -ENODEV; in sisusb_ioctl()
2915 mutex_lock(&sisusb->lock); in sisusb_ioctl()
2918 if (!sisusb->present || !sisusb->ready || !sisusb->sisusb_dev) { in sisusb_ioctl()
2919 retval = -ENODEV; in sisusb_ioctl()
2927 retval = -EFAULT; in sisusb_ioctl()
2937 x.sisusb_gfxinit = sisusb->gfxinit; in sisusb_ioctl()
2942 x.sisusb_vramsize = sisusb->vramsize; in sisusb_ioctl()
2943 x.sisusb_minor = sisusb->minor; in sisusb_ioctl()
2946 x.sisusb_conactive = sisusb->haveconsole ? 1 : 0; in sisusb_ioctl()
2953 retval = -EFAULT; in sisusb_ioctl()
2960 retval = -EFAULT; in sisusb_ioctl()
2967 retval = -ENOTTY; in sisusb_ioctl()
2972 mutex_unlock(&sisusb->lock); in sisusb_ioctl()
2987 return -ENOIOCTLCMD; in sisusb_compat_ioctl()
3018 dev_info(&dev->dev, "USB2VGA dongle found at address %d\n", in sisusb_probe()
3019 dev->devnum); in sisusb_probe()
3024 return -ENOMEM; in sisusb_probe()
3026 kref_init(&sisusb->kref); in sisusb_probe()
3028 mutex_init(&(sisusb->lock)); in sisusb_probe()
3030 sisusb->sisusb_dev = dev; in sisusb_probe()
3031 sisusb->vrambase = SISUSB_PCI_MEMBASE; in sisusb_probe()
3032 sisusb->mmiobase = SISUSB_PCI_MMIOBASE; in sisusb_probe()
3033 sisusb->mmiosize = SISUSB_PCI_MMIOSIZE; in sisusb_probe()
3034 sisusb->ioportbase = SISUSB_PCI_IOPORTBASE; in sisusb_probe()
3040 dev_err(&sisusb->sisusb_dev->dev, in sisusb_probe()
3042 dev->devnum); in sisusb_probe()
3043 retval = -ENODEV; in sisusb_probe()
3047 sisusb->minor = intf->minor; in sisusb_probe()
3050 sisusb->ibufsize = SISUSB_IBUF_SIZE; in sisusb_probe()
3051 sisusb->ibuf = kmalloc(SISUSB_IBUF_SIZE, GFP_KERNEL); in sisusb_probe()
3052 if (!sisusb->ibuf) { in sisusb_probe()
3053 retval = -ENOMEM; in sisusb_probe()
3057 sisusb->numobufs = 0; in sisusb_probe()
3058 sisusb->obufsize = SISUSB_OBUF_SIZE; in sisusb_probe()
3060 sisusb->obuf[i] = kmalloc(SISUSB_OBUF_SIZE, GFP_KERNEL); in sisusb_probe()
3061 if (!sisusb->obuf[i]) { in sisusb_probe()
3063 retval = -ENOMEM; in sisusb_probe()
3068 sisusb->numobufs++; in sisusb_probe()
3072 sisusb->sisurbin = usb_alloc_urb(0, GFP_KERNEL); in sisusb_probe()
3073 if (!sisusb->sisurbin) { in sisusb_probe()
3074 retval = -ENOMEM; in sisusb_probe()
3077 sisusb->completein = 1; in sisusb_probe()
3079 for (i = 0; i < sisusb->numobufs; i++) { in sisusb_probe()
3080 sisusb->sisurbout[i] = usb_alloc_urb(0, GFP_KERNEL); in sisusb_probe()
3081 if (!sisusb->sisurbout[i]) { in sisusb_probe()
3082 retval = -ENOMEM; in sisusb_probe()
3085 sisusb->urbout_context[i].sisusb = (void *)sisusb; in sisusb_probe()
3086 sisusb->urbout_context[i].urbindex = i; in sisusb_probe()
3087 sisusb->urbstatus[i] = 0; in sisusb_probe()
3090 dev_info(&sisusb->sisusb_dev->dev, "Allocated %d output buffers\n", in sisusb_probe()
3091 sisusb->numobufs); in sisusb_probe()
3095 sisusb->SiS_Pr = kmalloc(sizeof(struct SiS_Private), GFP_KERNEL); in sisusb_probe()
3096 if (!sisusb->SiS_Pr) { in sisusb_probe()
3097 retval = -ENOMEM; in sisusb_probe()
3104 init_waitqueue_head(&sisusb->wait_q); in sisusb_probe()
3108 usb_get_dev(sisusb->sisusb_dev); in sisusb_probe()
3110 sisusb->present = 1; in sisusb_probe()
3112 if (dev->speed == USB_SPEED_HIGH || dev->speed >= USB_SPEED_SUPER) { in sisusb_probe()
3121 dev_err(&sisusb->sisusb_dev->dev, in sisusb_probe()
3125 dev_info(&sisusb->sisusb_dev->dev, in sisusb_probe()
3128 sisusb->ready = 1; in sisusb_probe()
3131 dev_dbg(&sisusb->sisusb_dev->dev, "*** RWTEST ***\n"); in sisusb_probe()
3133 dev_dbg(&sisusb->sisusb_dev->dev, "*** RWTEST END ***\n"); in sisusb_probe()
3168 mutex_lock(&sisusb->lock); in sisusb_disconnect()
3176 sisusb->present = 0; in sisusb_disconnect()
3177 sisusb->ready = 0; in sisusb_disconnect()
3179 mutex_unlock(&sisusb->lock); in sisusb_disconnect()
3182 kref_put(&sisusb->kref, sisusb_delete); in sisusb_disconnect()
3228 MODULE_DESCRIPTION("sisusbvga - Driver for Net2280/SiS315-based USB2VGA dongles");