Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.19-rc1 2962 lines 80 kB view raw
1/* 2 * This program is free software; you can redistribute it and/or modify 3 * it under the terms of the GNU General Public License as published by 4 * the Free Software Foundation; either version 2 of the License, or 5 * (at your option) any later version. 6 * 7 * This program is distributed in the hope that it will be useful, 8 * but WITHOUT ANY WARRANTY; without even the implied warranty of 9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 * GNU General Public License for more details. 11 * 12 * You should have received a copy of the GNU General Public License 13 * along with this program; if not, write to the Free Software 14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 15 * 16 * Clean ups from Moschip version and a few ioctl implementations by: 17 * Paul B Schroeder <pschroeder "at" uplogix "dot" com> 18 * 19 * Originally based on drivers/usb/serial/io_edgeport.c which is: 20 * Copyright (C) 2000 Inside Out Networks, All rights reserved. 21 * Copyright (C) 2001-2002 Greg Kroah-Hartman <greg@kroah.com> 22 * 23 */ 24 25#include <linux/kernel.h> 26#include <linux/errno.h> 27#include <linux/init.h> 28#include <linux/slab.h> 29#include <linux/tty.h> 30#include <linux/tty_driver.h> 31#include <linux/tty_flip.h> 32#include <linux/module.h> 33#include <linux/serial.h> 34#include <linux/usb.h> 35#include <linux/usb/serial.h> 36#include <asm/uaccess.h> 37 38/* 39 * Version Information 40 */ 41#define DRIVER_VERSION "1.3.1" 42#define DRIVER_DESC "Moschip 7840/7820 USB Serial Driver" 43 44/* 45 * 16C50 UART register defines 46 */ 47 48#define LCR_BITS_5 0x00 /* 5 bits/char */ 49#define LCR_BITS_6 0x01 /* 6 bits/char */ 50#define LCR_BITS_7 0x02 /* 7 bits/char */ 51#define LCR_BITS_8 0x03 /* 8 bits/char */ 52#define LCR_BITS_MASK 0x03 /* Mask for bits/char field */ 53 54#define LCR_STOP_1 0x00 /* 1 stop bit */ 55#define LCR_STOP_1_5 0x04 /* 1.5 stop bits (if 5 bits/char) */ 56#define LCR_STOP_2 0x04 /* 2 stop bits (if 6-8 bits/char) */ 57#define LCR_STOP_MASK 0x04 /* Mask for stop bits field */ 58 59#define LCR_PAR_NONE 0x00 /* No parity */ 60#define LCR_PAR_ODD 0x08 /* Odd parity */ 61#define LCR_PAR_EVEN 0x18 /* Even parity */ 62#define LCR_PAR_MARK 0x28 /* Force parity bit to 1 */ 63#define LCR_PAR_SPACE 0x38 /* Force parity bit to 0 */ 64#define LCR_PAR_MASK 0x38 /* Mask for parity field */ 65 66#define LCR_SET_BREAK 0x40 /* Set Break condition */ 67#define LCR_DL_ENABLE 0x80 /* Enable access to divisor latch */ 68 69#define MCR_DTR 0x01 /* Assert DTR */ 70#define MCR_RTS 0x02 /* Assert RTS */ 71#define MCR_OUT1 0x04 /* Loopback only: Sets state of RI */ 72#define MCR_MASTER_IE 0x08 /* Enable interrupt outputs */ 73#define MCR_LOOPBACK 0x10 /* Set internal (digital) loopback mode */ 74#define MCR_XON_ANY 0x20 /* Enable any char to exit XOFF mode */ 75 76#define MOS7840_MSR_CTS 0x10 /* Current state of CTS */ 77#define MOS7840_MSR_DSR 0x20 /* Current state of DSR */ 78#define MOS7840_MSR_RI 0x40 /* Current state of RI */ 79#define MOS7840_MSR_CD 0x80 /* Current state of CD */ 80 81/* 82 * Defines used for sending commands to port 83 */ 84 85#define WAIT_FOR_EVER (HZ * 0 ) /* timeout urb is wait for ever */ 86#define MOS_WDR_TIMEOUT (HZ * 5 ) /* default urb timeout */ 87 88#define MOS_PORT1 0x0200 89#define MOS_PORT2 0x0300 90#define MOS_VENREG 0x0000 91#define MOS_MAX_PORT 0x02 92#define MOS_WRITE 0x0E 93#define MOS_READ 0x0D 94 95/* Requests */ 96#define MCS_RD_RTYPE 0xC0 97#define MCS_WR_RTYPE 0x40 98#define MCS_RDREQ 0x0D 99#define MCS_WRREQ 0x0E 100#define MCS_CTRL_TIMEOUT 500 101#define VENDOR_READ_LENGTH (0x01) 102 103#define MAX_NAME_LEN 64 104 105#define ZLP_REG1 0x3A //Zero_Flag_Reg1 58 106#define ZLP_REG5 0x3E //Zero_Flag_Reg5 62 107 108/* For higher baud Rates use TIOCEXBAUD */ 109#define TIOCEXBAUD 0x5462 110 111/* vendor id and device id defines */ 112 113#define USB_VENDOR_ID_MOSCHIP 0x9710 114#define MOSCHIP_DEVICE_ID_7840 0x7840 115#define MOSCHIP_DEVICE_ID_7820 0x7820 116 117/* Interrupt Rotinue Defines */ 118 119#define SERIAL_IIR_RLS 0x06 120#define SERIAL_IIR_MS 0x00 121 122/* 123 * Emulation of the bit mask on the LINE STATUS REGISTER. 124 */ 125#define SERIAL_LSR_DR 0x0001 126#define SERIAL_LSR_OE 0x0002 127#define SERIAL_LSR_PE 0x0004 128#define SERIAL_LSR_FE 0x0008 129#define SERIAL_LSR_BI 0x0010 130 131#define MOS_MSR_DELTA_CTS 0x10 132#define MOS_MSR_DELTA_DSR 0x20 133#define MOS_MSR_DELTA_RI 0x40 134#define MOS_MSR_DELTA_CD 0x80 135 136// Serial Port register Address 137#define INTERRUPT_ENABLE_REGISTER ((__u16)(0x01)) 138#define FIFO_CONTROL_REGISTER ((__u16)(0x02)) 139#define LINE_CONTROL_REGISTER ((__u16)(0x03)) 140#define MODEM_CONTROL_REGISTER ((__u16)(0x04)) 141#define LINE_STATUS_REGISTER ((__u16)(0x05)) 142#define MODEM_STATUS_REGISTER ((__u16)(0x06)) 143#define SCRATCH_PAD_REGISTER ((__u16)(0x07)) 144#define DIVISOR_LATCH_LSB ((__u16)(0x00)) 145#define DIVISOR_LATCH_MSB ((__u16)(0x01)) 146 147#define CLK_MULTI_REGISTER ((__u16)(0x02)) 148#define CLK_START_VALUE_REGISTER ((__u16)(0x03)) 149 150#define SERIAL_LCR_DLAB ((__u16)(0x0080)) 151 152/* 153 * URB POOL related defines 154 */ 155#define NUM_URBS 16 /* URB Count */ 156#define URB_TRANSFER_BUFFER_SIZE 32 /* URB Size */ 157 158 159static struct usb_device_id moschip_port_id_table[] = { 160 {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7840)}, 161 {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)}, 162 {} /* terminating entry */ 163}; 164 165static __devinitdata struct usb_device_id moschip_id_table_combined[] = { 166 {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7840)}, 167 {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)}, 168 {} /* terminating entry */ 169}; 170 171MODULE_DEVICE_TABLE(usb, moschip_id_table_combined); 172 173/* This structure holds all of the local port information */ 174 175struct moschip_port { 176 int port_num; /*Actual port number in the device(1,2,etc) */ 177 struct urb *write_urb; /* write URB for this port */ 178 struct urb *read_urb; /* read URB for this port */ 179 __u8 shadowLCR; /* last LCR value received */ 180 __u8 shadowMCR; /* last MCR value received */ 181 char open; 182 wait_queue_head_t wait_chase; /* for handling sleeping while waiting for chase to finish */ 183 wait_queue_head_t delta_msr_wait; /* for handling sleeping while waiting for msr change to happen */ 184 int delta_msr_cond; 185 struct async_icount icount; 186 struct usb_serial_port *port; /* loop back to the owner of this object */ 187 188 /*Offsets */ 189 __u8 SpRegOffset; 190 __u8 ControlRegOffset; 191 __u8 DcrRegOffset; 192 //for processing control URBS in interrupt context 193 struct urb *control_urb; 194 char *ctrl_buf; 195 int MsrLsr; 196 197 struct urb *write_urb_pool[NUM_URBS]; 198}; 199 200 201static int debug; 202static int mos7840_num_ports; //this says the number of ports in the device 203static int mos7840_num_open_ports; 204 205 206/* 207 * mos7840_set_reg_sync 208 * To set the Control register by calling usb_fill_control_urb function 209 * by passing usb_sndctrlpipe function as parameter. 210 */ 211 212static int mos7840_set_reg_sync(struct usb_serial_port *port, __u16 reg, 213 __u16 val) 214{ 215 struct usb_device *dev = port->serial->dev; 216 val = val & 0x00ff; 217 dbg("mos7840_set_reg_sync offset is %x, value %x\n", reg, val); 218 219 return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), MCS_WRREQ, 220 MCS_WR_RTYPE, val, reg, NULL, 0, 221 MOS_WDR_TIMEOUT); 222} 223 224/* 225 * mos7840_get_reg_sync 226 * To set the Uart register by calling usb_fill_control_urb function by 227 * passing usb_rcvctrlpipe function as parameter. 228 */ 229 230static int mos7840_get_reg_sync(struct usb_serial_port *port, __u16 reg, 231 __u16 * val) 232{ 233 struct usb_device *dev = port->serial->dev; 234 int ret = 0; 235 236 ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ, 237 MCS_RD_RTYPE, 0, reg, val, VENDOR_READ_LENGTH, 238 MOS_WDR_TIMEOUT); 239 dbg("mos7840_get_reg_sync offset is %x, return val %x\n", reg, *val); 240 *val = (*val) & 0x00ff; 241 return ret; 242} 243 244/* 245 * mos7840_set_uart_reg 246 * To set the Uart register by calling usb_fill_control_urb function by 247 * passing usb_sndctrlpipe function as parameter. 248 */ 249 250static int mos7840_set_uart_reg(struct usb_serial_port *port, __u16 reg, 251 __u16 val) 252{ 253 254 struct usb_device *dev = port->serial->dev; 255 val = val & 0x00ff; 256 // For the UART control registers, the application number need to be Or'ed 257 if (mos7840_num_ports == 4) { 258 val |= 259 (((__u16) port->number - (__u16) (port->serial->minor)) + 260 1) << 8; 261 dbg("mos7840_set_uart_reg application number is %x\n", val); 262 } else { 263 if (((__u16) port->number - (__u16) (port->serial->minor)) == 0) { 264 val |= 265 (((__u16) port->number - 266 (__u16) (port->serial->minor)) + 1) << 8; 267 dbg("mos7840_set_uart_reg application number is %x\n", 268 val); 269 } else { 270 val |= 271 (((__u16) port->number - 272 (__u16) (port->serial->minor)) + 2) << 8; 273 dbg("mos7840_set_uart_reg application number is %x\n", 274 val); 275 } 276 } 277 return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), MCS_WRREQ, 278 MCS_WR_RTYPE, val, reg, NULL, 0, 279 MOS_WDR_TIMEOUT); 280 281} 282 283/* 284 * mos7840_get_uart_reg 285 * To set the Control register by calling usb_fill_control_urb function 286 * by passing usb_rcvctrlpipe function as parameter. 287 */ 288static int mos7840_get_uart_reg(struct usb_serial_port *port, __u16 reg, 289 __u16 * val) 290{ 291 struct usb_device *dev = port->serial->dev; 292 int ret = 0; 293 __u16 Wval; 294 295 //dbg("application number is %4x \n",(((__u16)port->number - (__u16)(port->serial->minor))+1)<<8); 296 /*Wval is same as application number */ 297 if (mos7840_num_ports == 4) { 298 Wval = 299 (((__u16) port->number - (__u16) (port->serial->minor)) + 300 1) << 8; 301 dbg("mos7840_get_uart_reg application number is %x\n", Wval); 302 } else { 303 if (((__u16) port->number - (__u16) (port->serial->minor)) == 0) { 304 Wval = 305 (((__u16) port->number - 306 (__u16) (port->serial->minor)) + 1) << 8; 307 dbg("mos7840_get_uart_reg application number is %x\n", 308 Wval); 309 } else { 310 Wval = 311 (((__u16) port->number - 312 (__u16) (port->serial->minor)) + 2) << 8; 313 dbg("mos7840_get_uart_reg application number is %x\n", 314 Wval); 315 } 316 } 317 ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), MCS_RDREQ, 318 MCS_RD_RTYPE, Wval, reg, val, VENDOR_READ_LENGTH, 319 MOS_WDR_TIMEOUT); 320 *val = (*val) & 0x00ff; 321 return ret; 322} 323 324static void mos7840_dump_serial_port(struct moschip_port *mos7840_port) 325{ 326 327 dbg("***************************************\n"); 328 dbg("SpRegOffset is %2x\n", mos7840_port->SpRegOffset); 329 dbg("ControlRegOffset is %2x \n", mos7840_port->ControlRegOffset); 330 dbg("DCRRegOffset is %2x \n", mos7840_port->DcrRegOffset); 331 dbg("***************************************\n"); 332 333} 334 335/************************************************************************/ 336/************************************************************************/ 337/* I N T E R F A C E F U N C T I O N S */ 338/* I N T E R F A C E F U N C T I O N S */ 339/************************************************************************/ 340/************************************************************************/ 341 342static inline void mos7840_set_port_private(struct usb_serial_port *port, 343 struct moschip_port *data) 344{ 345 usb_set_serial_port_data(port, (void *)data); 346} 347 348static inline struct moschip_port *mos7840_get_port_private(struct 349 usb_serial_port 350 *port) 351{ 352 return (struct moschip_port *)usb_get_serial_port_data(port); 353} 354 355static int mos7840_handle_new_msr(struct moschip_port *port, __u8 new_msr) 356{ 357 struct moschip_port *mos7840_port; 358 struct async_icount *icount; 359 mos7840_port = port; 360 icount = &mos7840_port->icount; 361 if (new_msr & 362 (MOS_MSR_DELTA_CTS | MOS_MSR_DELTA_DSR | MOS_MSR_DELTA_RI | 363 MOS_MSR_DELTA_CD)) { 364 icount = &mos7840_port->icount; 365 366 /* update input line counters */ 367 if (new_msr & MOS_MSR_DELTA_CTS) { 368 icount->cts++; 369 } 370 if (new_msr & MOS_MSR_DELTA_DSR) { 371 icount->dsr++; 372 } 373 if (new_msr & MOS_MSR_DELTA_CD) { 374 icount->dcd++; 375 } 376 if (new_msr & MOS_MSR_DELTA_RI) { 377 icount->rng++; 378 } 379 } 380 381 return 0; 382} 383 384static int mos7840_handle_new_lsr(struct moschip_port *port, __u8 new_lsr) 385{ 386 struct async_icount *icount; 387 388 dbg("%s - %02x", __FUNCTION__, new_lsr); 389 390 if (new_lsr & SERIAL_LSR_BI) { 391 // 392 // Parity and Framing errors only count if they 393 // occur exclusive of a break being 394 // received. 395 // 396 new_lsr &= (__u8) (SERIAL_LSR_OE | SERIAL_LSR_BI); 397 } 398 399 /* update input line counters */ 400 icount = &port->icount; 401 if (new_lsr & SERIAL_LSR_BI) { 402 icount->brk++; 403 } 404 if (new_lsr & SERIAL_LSR_OE) { 405 icount->overrun++; 406 } 407 if (new_lsr & SERIAL_LSR_PE) { 408 icount->parity++; 409 } 410 if (new_lsr & SERIAL_LSR_FE) { 411 icount->frame++; 412 } 413 414 return 0; 415} 416 417/************************************************************************/ 418/************************************************************************/ 419/* U S B C A L L B A C K F U N C T I O N S */ 420/* U S B C A L L B A C K F U N C T I O N S */ 421/************************************************************************/ 422/************************************************************************/ 423 424static void mos7840_control_callback(struct urb *urb, struct pt_regs *regs) 425{ 426 unsigned char *data; 427 struct moschip_port *mos7840_port; 428 __u8 regval = 0x0; 429 430 if (!urb) { 431 dbg("%s", "Invalid Pointer !!!!:\n"); 432 return; 433 } 434 435 switch (urb->status) { 436 case 0: 437 /* success */ 438 break; 439 case -ECONNRESET: 440 case -ENOENT: 441 case -ESHUTDOWN: 442 /* this urb is terminated, clean up */ 443 dbg("%s - urb shutting down with status: %d", __FUNCTION__, 444 urb->status); 445 return; 446 default: 447 dbg("%s - nonzero urb status received: %d", __FUNCTION__, 448 urb->status); 449 goto exit; 450 } 451 452 mos7840_port = (struct moschip_port *)urb->context; 453 454 dbg("%s urb buffer size is %d\n", __FUNCTION__, urb->actual_length); 455 dbg("%s mos7840_port->MsrLsr is %d port %d\n", __FUNCTION__, 456 mos7840_port->MsrLsr, mos7840_port->port_num); 457 data = urb->transfer_buffer; 458 regval = (__u8) data[0]; 459 dbg("%s data is %x\n", __FUNCTION__, regval); 460 if (mos7840_port->MsrLsr == 0) 461 mos7840_handle_new_msr(mos7840_port, regval); 462 else if (mos7840_port->MsrLsr == 1) 463 mos7840_handle_new_lsr(mos7840_port, regval); 464 465 exit: 466 return; 467} 468 469static int mos7840_get_reg(struct moschip_port *mcs, __u16 Wval, __u16 reg, 470 __u16 * val) 471{ 472 struct usb_device *dev = mcs->port->serial->dev; 473 struct usb_ctrlrequest *dr = NULL; 474 unsigned char *buffer = NULL; 475 int ret = 0; 476 buffer = (__u8 *) mcs->ctrl_buf; 477 478// dr=(struct usb_ctrlrequest *)(buffer); 479 dr = (void *)(buffer + 2); 480 dr->bRequestType = MCS_RD_RTYPE; 481 dr->bRequest = MCS_RDREQ; 482 dr->wValue = cpu_to_le16(Wval); //0; 483 dr->wIndex = cpu_to_le16(reg); 484 dr->wLength = cpu_to_le16(2); 485 486 usb_fill_control_urb(mcs->control_urb, dev, usb_rcvctrlpipe(dev, 0), 487 (unsigned char *)dr, buffer, 2, 488 mos7840_control_callback, mcs); 489 mcs->control_urb->transfer_buffer_length = 2; 490 ret = usb_submit_urb(mcs->control_urb, GFP_ATOMIC); 491 return ret; 492} 493 494/***************************************************************************** 495 * mos7840_interrupt_callback 496 * this is the callback function for when we have received data on the 497 * interrupt endpoint. 498 *****************************************************************************/ 499 500static void mos7840_interrupt_callback(struct urb *urb, struct pt_regs *regs) 501{ 502 int result; 503 int length; 504 struct moschip_port *mos7840_port; 505 struct usb_serial *serial; 506 __u16 Data; 507 unsigned char *data; 508 __u8 sp[5], st; 509 int i; 510 __u16 wval; 511 512 dbg("%s", " : Entering\n"); 513 if (!urb) { 514 dbg("%s", "Invalid Pointer !!!!:\n"); 515 return; 516 } 517 518 switch (urb->status) { 519 case 0: 520 /* success */ 521 break; 522 case -ECONNRESET: 523 case -ENOENT: 524 case -ESHUTDOWN: 525 /* this urb is terminated, clean up */ 526 dbg("%s - urb shutting down with status: %d", __FUNCTION__, 527 urb->status); 528 return; 529 default: 530 dbg("%s - nonzero urb status received: %d", __FUNCTION__, 531 urb->status); 532 goto exit; 533 } 534 535 length = urb->actual_length; 536 data = urb->transfer_buffer; 537 538 serial = (struct usb_serial *)urb->context; 539 540 /* Moschip get 5 bytes 541 * Byte 1 IIR Port 1 (port.number is 0) 542 * Byte 2 IIR Port 2 (port.number is 1) 543 * Byte 3 IIR Port 3 (port.number is 2) 544 * Byte 4 IIR Port 4 (port.number is 3) 545 * Byte 5 FIFO status for both */ 546 547 if (length && length > 5) { 548 dbg("%s \n", "Wrong data !!!"); 549 return; 550 } 551 552 sp[0] = (__u8) data[0]; 553 sp[1] = (__u8) data[1]; 554 sp[2] = (__u8) data[2]; 555 sp[3] = (__u8) data[3]; 556 st = (__u8) data[4]; 557 558 for (i = 0; i < serial->num_ports; i++) { 559 mos7840_port = mos7840_get_port_private(serial->port[i]); 560 wval = 561 (((__u16) serial->port[i]->number - 562 (__u16) (serial->minor)) + 1) << 8; 563 if (mos7840_port->open) { 564 if (sp[i] & 0x01) { 565 dbg("SP%d No Interrupt !!!\n", i); 566 } else { 567 switch (sp[i] & 0x0f) { 568 case SERIAL_IIR_RLS: 569 dbg("Serial Port %d: Receiver status error or ", i); 570 dbg("address bit detected in 9-bit mode\n"); 571 mos7840_port->MsrLsr = 1; 572 mos7840_get_reg(mos7840_port, wval, 573 LINE_STATUS_REGISTER, 574 &Data); 575 break; 576 case SERIAL_IIR_MS: 577 dbg("Serial Port %d: Modem status change\n", i); 578 mos7840_port->MsrLsr = 0; 579 mos7840_get_reg(mos7840_port, wval, 580 MODEM_STATUS_REGISTER, 581 &Data); 582 break; 583 } 584 } 585 } 586 } 587 exit: 588 result = usb_submit_urb(urb, GFP_ATOMIC); 589 if (result) { 590 dev_err(&urb->dev->dev, 591 "%s - Error %d submitting interrupt urb\n", 592 __FUNCTION__, result); 593 } 594 595 return; 596 597} 598 599static int mos7840_port_paranoia_check(struct usb_serial_port *port, 600 const char *function) 601{ 602 if (!port) { 603 dbg("%s - port == NULL", function); 604 return -1; 605 } 606 if (!port->serial) { 607 dbg("%s - port->serial == NULL", function); 608 return -1; 609 } 610 611 return 0; 612} 613 614/* Inline functions to check the sanity of a pointer that is passed to us */ 615static int mos7840_serial_paranoia_check(struct usb_serial *serial, 616 const char *function) 617{ 618 if (!serial) { 619 dbg("%s - serial == NULL", function); 620 return -1; 621 } 622 if (!serial->type) { 623 dbg("%s - serial->type == NULL!", function); 624 return -1; 625 } 626 627 return 0; 628} 629 630static struct usb_serial *mos7840_get_usb_serial(struct usb_serial_port *port, 631 const char *function) 632{ 633 /* if no port was specified, or it fails a paranoia check */ 634 if (!port || 635 mos7840_port_paranoia_check(port, function) || 636 mos7840_serial_paranoia_check(port->serial, function)) { 637 /* then say that we don't have a valid usb_serial thing, which will * end up genrating -ENODEV return values */ 638 return NULL; 639 } 640 641 return port->serial; 642} 643 644/***************************************************************************** 645 * mos7840_bulk_in_callback 646 * this is the callback function for when we have received data on the 647 * bulk in endpoint. 648 *****************************************************************************/ 649 650static void mos7840_bulk_in_callback(struct urb *urb, struct pt_regs *regs) 651{ 652 int status; 653 unsigned char *data; 654 struct usb_serial *serial; 655 struct usb_serial_port *port; 656 struct moschip_port *mos7840_port; 657 struct tty_struct *tty; 658 659 if (!urb) { 660 dbg("%s", "Invalid Pointer !!!!:\n"); 661 return; 662 } 663 664 if (urb->status) { 665 dbg("nonzero read bulk status received: %d", urb->status); 666 return; 667 } 668 669 mos7840_port = (struct moschip_port *)urb->context; 670 if (!mos7840_port) { 671 dbg("%s", "NULL mos7840_port pointer \n"); 672 return; 673 } 674 675 port = (struct usb_serial_port *)mos7840_port->port; 676 if (mos7840_port_paranoia_check(port, __FUNCTION__)) { 677 dbg("%s", "Port Paranoia failed \n"); 678 return; 679 } 680 681 serial = mos7840_get_usb_serial(port, __FUNCTION__); 682 if (!serial) { 683 dbg("%s\n", "Bad serial pointer "); 684 return; 685 } 686 687 dbg("%s\n", "Entering... \n"); 688 689 data = urb->transfer_buffer; 690 691 dbg("%s", "Entering ........... \n"); 692 693 if (urb->actual_length) { 694 tty = mos7840_port->port->tty; 695 if (tty) { 696 tty_buffer_request_room(tty, urb->actual_length); 697 tty_insert_flip_string(tty, data, urb->actual_length); 698 dbg(" %s \n", data); 699 tty_flip_buffer_push(tty); 700 } 701 mos7840_port->icount.rx += urb->actual_length; 702 dbg("mos7840_port->icount.rx is %d:\n", 703 mos7840_port->icount.rx); 704 } 705 706 if (!mos7840_port->read_urb) { 707 dbg("%s", "URB KILLED !!!\n"); 708 return; 709 } 710 711 if (mos7840_port->read_urb->status != -EINPROGRESS) { 712 mos7840_port->read_urb->dev = serial->dev; 713 714 status = usb_submit_urb(mos7840_port->read_urb, GFP_ATOMIC); 715 716 if (status) { 717 dbg(" usb_submit_urb(read bulk) failed, status = %d", 718 status); 719 } 720 } 721} 722 723/***************************************************************************** 724 * mos7840_bulk_out_data_callback 725 * this is the callback function for when we have finished sending serial data 726 * on the bulk out endpoint. 727 *****************************************************************************/ 728 729static void mos7840_bulk_out_data_callback(struct urb *urb, 730 struct pt_regs *regs) 731{ 732 struct moschip_port *mos7840_port; 733 struct tty_struct *tty; 734 if (!urb) { 735 dbg("%s", "Invalid Pointer !!!!:\n"); 736 return; 737 } 738 739 if (urb->status) { 740 dbg("nonzero write bulk status received:%d\n", urb->status); 741 return; 742 } 743 744 mos7840_port = (struct moschip_port *)urb->context; 745 if (!mos7840_port) { 746 dbg("%s", "NULL mos7840_port pointer \n"); 747 return; 748 } 749 750 if (mos7840_port_paranoia_check(mos7840_port->port, __FUNCTION__)) { 751 dbg("%s", "Port Paranoia failed \n"); 752 return; 753 } 754 755 dbg("%s \n", "Entering ........."); 756 757 tty = mos7840_port->port->tty; 758 759 if (tty && mos7840_port->open) { 760 /* let the tty driver wakeup if it has a special * 761 * write_wakeup function */ 762 763 if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) 764 && tty->ldisc.write_wakeup) { 765 (tty->ldisc.write_wakeup) (tty); 766 } 767 768 /* tell the tty driver that something has changed */ 769 wake_up_interruptible(&tty->write_wait); 770 } 771 772} 773 774/************************************************************************/ 775/* D R I V E R T T Y I N T E R F A C E F U N C T I O N S */ 776/************************************************************************/ 777#ifdef MCSSerialProbe 778static int mos7840_serial_probe(struct usb_serial *serial, 779 const struct usb_device_id *id) 780{ 781 782 /*need to implement the mode_reg reading and updating\ 783 structures usb_serial_ device_type\ 784 (i.e num_ports, num_bulkin,bulkout etc) */ 785 /* Also we can update the changes attach */ 786 return 1; 787} 788#endif 789 790/***************************************************************************** 791 * mos7840_open 792 * this function is called by the tty driver when a port is opened 793 * If successful, we return 0 794 * Otherwise we return a negative error number. 795 *****************************************************************************/ 796 797static int mos7840_open(struct usb_serial_port *port, struct file *filp) 798{ 799 int response; 800 int j; 801 struct usb_serial *serial; 802 struct urb *urb; 803 __u16 Data; 804 int status; 805 struct moschip_port *mos7840_port; 806 807 if (mos7840_port_paranoia_check(port, __FUNCTION__)) { 808 dbg("%s", "Port Paranoia failed \n"); 809 return -ENODEV; 810 } 811 812 mos7840_num_open_ports++; 813 serial = port->serial; 814 815 if (mos7840_serial_paranoia_check(serial, __FUNCTION__)) { 816 dbg("%s", "Serial Paranoia failed \n"); 817 return -ENODEV; 818 } 819 820 mos7840_port = mos7840_get_port_private(port); 821 822 if (mos7840_port == NULL) 823 return -ENODEV; 824 825 usb_clear_halt(serial->dev, port->write_urb->pipe); 826 usb_clear_halt(serial->dev, port->read_urb->pipe); 827 828 /* Initialising the write urb pool */ 829 for (j = 0; j < NUM_URBS; ++j) { 830 urb = usb_alloc_urb(0, SLAB_ATOMIC); 831 mos7840_port->write_urb_pool[j] = urb; 832 833 if (urb == NULL) { 834 err("No more urbs???"); 835 continue; 836 } 837 838 urb->transfer_buffer = NULL; 839 urb->transfer_buffer = 840 kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL); 841 if (!urb->transfer_buffer) { 842 err("%s-out of memory for urb buffers.", __FUNCTION__); 843 continue; 844 } 845 } 846 847/***************************************************************************** 848 * Initialize MCS7840 -- Write Init values to corresponding Registers 849 * 850 * Register Index 851 * 1 : IER 852 * 2 : FCR 853 * 3 : LCR 854 * 4 : MCR 855 * 856 * 0x08 : SP1/2 Control Reg 857 *****************************************************************************/ 858 859//NEED to check the following Block 860 861 status = 0; 862 Data = 0x0; 863 status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, &Data); 864 if (status < 0) { 865 dbg("Reading Spreg failed\n"); 866 return -1; 867 } 868 Data |= 0x80; 869 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); 870 if (status < 0) { 871 dbg("writing Spreg failed\n"); 872 return -1; 873 } 874 875 Data &= ~0x80; 876 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); 877 if (status < 0) { 878 dbg("writing Spreg failed\n"); 879 return -1; 880 } 881//End of block to be checked 882 883 status = 0; 884 Data = 0x0; 885 status = 886 mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset, &Data); 887 if (status < 0) { 888 dbg("Reading Controlreg failed\n"); 889 return -1; 890 } 891 Data |= 0x08; //Driver done bit 892 Data |= 0x20; //rx_disable 893 status = 0; 894 status = 895 mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset, Data); 896 if (status < 0) { 897 dbg("writing Controlreg failed\n"); 898 return -1; 899 } 900 //do register settings here 901 // Set all regs to the device default values. 902 //////////////////////////////////// 903 // First Disable all interrupts. 904 //////////////////////////////////// 905 906 Data = 0x00; 907 status = 0; 908 status = mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data); 909 if (status < 0) { 910 dbg("disableing interrupts failed\n"); 911 return -1; 912 } 913 // Set FIFO_CONTROL_REGISTER to the default value 914 Data = 0x00; 915 status = 0; 916 status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data); 917 if (status < 0) { 918 dbg("Writing FIFO_CONTROL_REGISTER failed\n"); 919 return -1; 920 } 921 922 Data = 0xcf; 923 status = 0; 924 status = mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data); 925 if (status < 0) { 926 dbg("Writing FIFO_CONTROL_REGISTER failed\n"); 927 return -1; 928 } 929 930 Data = 0x03; 931 status = 0; 932 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 933 mos7840_port->shadowLCR = Data; 934 935 Data = 0x0b; 936 status = 0; 937 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data); 938 mos7840_port->shadowMCR = Data; 939 940 Data = 0x00; 941 status = 0; 942 status = mos7840_get_uart_reg(port, LINE_CONTROL_REGISTER, &Data); 943 mos7840_port->shadowLCR = Data; 944 945 Data |= SERIAL_LCR_DLAB; //data latch enable in LCR 0x80 946 status = 0; 947 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 948 949 Data = 0x0c; 950 status = 0; 951 status = mos7840_set_uart_reg(port, DIVISOR_LATCH_LSB, Data); 952 953 Data = 0x0; 954 status = 0; 955 status = mos7840_set_uart_reg(port, DIVISOR_LATCH_MSB, Data); 956 957 Data = 0x00; 958 status = 0; 959 status = mos7840_get_uart_reg(port, LINE_CONTROL_REGISTER, &Data); 960 961 Data = Data & ~SERIAL_LCR_DLAB; 962 status = 0; 963 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 964 mos7840_port->shadowLCR = Data; 965 966 //clearing Bulkin and Bulkout Fifo 967 Data = 0x0; 968 status = 0; 969 status = mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, &Data); 970 971 Data = Data | 0x0c; 972 status = 0; 973 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); 974 975 Data = Data & ~0x0c; 976 status = 0; 977 status = mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); 978 //Finally enable all interrupts 979 Data = 0x0; 980 Data = 0x0c; 981 status = 0; 982 status = mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data); 983 984 //clearing rx_disable 985 Data = 0x0; 986 status = 0; 987 status = 988 mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset, &Data); 989 Data = Data & ~0x20; 990 status = 0; 991 status = 992 mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset, Data); 993 994 // rx_negate 995 Data = 0x0; 996 status = 0; 997 status = 998 mos7840_get_reg_sync(port, mos7840_port->ControlRegOffset, &Data); 999 Data = Data | 0x10; 1000 status = 0; 1001 status = 1002 mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset, Data); 1003 1004 /* force low_latency on so that our tty_push actually forces * 1005 * the data through,otherwise it is scheduled, and with * 1006 * high data rates (like with OHCI) data can get lost. */ 1007 1008 if (port->tty) 1009 port->tty->low_latency = 1; 1010/* Check to see if we've set up our endpoint info yet * 1011 * (can't set it up in mos7840_startup as the structures * 1012 * were not set up at that time.) */ 1013 if (mos7840_num_open_ports == 1) { 1014 if (serial->port[0]->interrupt_in_buffer == NULL) { 1015 1016 /* set up interrupt urb */ 1017 1018 usb_fill_int_urb(serial->port[0]->interrupt_in_urb, 1019 serial->dev, 1020 usb_rcvintpipe(serial->dev, 1021 serial->port[0]-> 1022 interrupt_in_endpointAddress), 1023 serial->port[0]->interrupt_in_buffer, 1024 serial->port[0]->interrupt_in_urb-> 1025 transfer_buffer_length, 1026 mos7840_interrupt_callback, 1027 serial, 1028 serial->port[0]->interrupt_in_urb-> 1029 interval); 1030 1031 /* start interrupt read for mos7840 * 1032 * will continue as long as mos7840 is connected */ 1033 1034 response = 1035 usb_submit_urb(serial->port[0]->interrupt_in_urb, 1036 GFP_KERNEL); 1037 if (response) { 1038 err("%s - Error %d submitting interrupt urb", 1039 __FUNCTION__, response); 1040 } 1041 1042 } 1043 1044 } 1045 1046 /* see if we've set up our endpoint info yet * 1047 * (can't set it up in mos7840_startup as the * 1048 * structures were not set up at that time.) */ 1049 1050 dbg("port number is %d \n", port->number); 1051 dbg("serial number is %d \n", port->serial->minor); 1052 dbg("Bulkin endpoint is %d \n", port->bulk_in_endpointAddress); 1053 dbg("BulkOut endpoint is %d \n", port->bulk_out_endpointAddress); 1054 dbg("Interrupt endpoint is %d \n", port->interrupt_in_endpointAddress); 1055 dbg("port's number in the device is %d\n", mos7840_port->port_num); 1056 mos7840_port->read_urb = port->read_urb; 1057 1058 /* set up our bulk in urb */ 1059 1060 usb_fill_bulk_urb(mos7840_port->read_urb, 1061 serial->dev, 1062 usb_rcvbulkpipe(serial->dev, 1063 port->bulk_in_endpointAddress), 1064 port->bulk_in_buffer, 1065 mos7840_port->read_urb->transfer_buffer_length, 1066 mos7840_bulk_in_callback, mos7840_port); 1067 1068 dbg("mos7840_open: bulkin endpoint is %d\n", 1069 port->bulk_in_endpointAddress); 1070 response = usb_submit_urb(mos7840_port->read_urb, GFP_KERNEL); 1071 if (response) { 1072 err("%s - Error %d submitting control urb", __FUNCTION__, 1073 response); 1074 } 1075 1076 /* initialize our wait queues */ 1077 init_waitqueue_head(&mos7840_port->wait_chase); 1078 init_waitqueue_head(&mos7840_port->delta_msr_wait); 1079 1080 /* initialize our icount structure */ 1081 memset(&(mos7840_port->icount), 0x00, sizeof(mos7840_port->icount)); 1082 1083 /* initialize our port settings */ 1084 mos7840_port->shadowMCR = MCR_MASTER_IE; /* Must set to enable ints! */ 1085 /* send a open port command */ 1086 mos7840_port->open = 1; 1087 //mos7840_change_port_settings(mos7840_port,old_termios); 1088 mos7840_port->icount.tx = 0; 1089 mos7840_port->icount.rx = 0; 1090 1091 dbg("\n\nusb_serial serial:%x mos7840_port:%x\n usb_serial_port port:%x\n\n", (unsigned int)serial, (unsigned int)mos7840_port, (unsigned int)port); 1092 1093 return 0; 1094 1095} 1096 1097/***************************************************************************** 1098 * mos7840_chars_in_buffer 1099 * this function is called by the tty driver when it wants to know how many 1100 * bytes of data we currently have outstanding in the port (data that has 1101 * been written, but hasn't made it out the port yet) 1102 * If successful, we return the number of bytes left to be written in the 1103 * system, 1104 * Otherwise we return a negative error number. 1105 *****************************************************************************/ 1106 1107static int mos7840_chars_in_buffer(struct usb_serial_port *port) 1108{ 1109 int i; 1110 int chars = 0; 1111 struct moschip_port *mos7840_port; 1112 1113 dbg("%s \n", " mos7840_chars_in_buffer:entering ..........."); 1114 1115 if (mos7840_port_paranoia_check(port, __FUNCTION__)) { 1116 dbg("%s", "Invalid port \n"); 1117 return -1; 1118 } 1119 1120 mos7840_port = mos7840_get_port_private(port); 1121 if (mos7840_port == NULL) { 1122 dbg("%s \n", "mos7840_break:leaving ..........."); 1123 return -1; 1124 } 1125 1126 for (i = 0; i < NUM_URBS; ++i) { 1127 if (mos7840_port->write_urb_pool[i]->status == -EINPROGRESS) { 1128 chars += URB_TRANSFER_BUFFER_SIZE; 1129 } 1130 } 1131 dbg("%s - returns %d", __FUNCTION__, chars); 1132 return (chars); 1133 1134} 1135 1136/************************************************************************ 1137 * 1138 * mos7840_block_until_tx_empty 1139 * 1140 * This function will block the close until one of the following: 1141 * 1. TX count are 0 1142 * 2. The mos7840 has stopped 1143 * 3. A timout of 3 seconds without activity has expired 1144 * 1145 ************************************************************************/ 1146static void mos7840_block_until_tx_empty(struct moschip_port *mos7840_port) 1147{ 1148 int timeout = HZ / 10; 1149 int wait = 30; 1150 int count; 1151 1152 while (1) { 1153 1154 count = mos7840_chars_in_buffer(mos7840_port->port); 1155 1156 /* Check for Buffer status */ 1157 if (count <= 0) { 1158 return; 1159 } 1160 1161 /* Block the thread for a while */ 1162 interruptible_sleep_on_timeout(&mos7840_port->wait_chase, 1163 timeout); 1164 1165 /* No activity.. count down section */ 1166 wait--; 1167 if (wait == 0) { 1168 dbg("%s - TIMEOUT", __FUNCTION__); 1169 return; 1170 } else { 1171 /* Reset timout value back to seconds */ 1172 wait = 30; 1173 } 1174 } 1175} 1176 1177/***************************************************************************** 1178 * mos7840_close 1179 * this function is called by the tty driver when a port is closed 1180 *****************************************************************************/ 1181 1182static void mos7840_close(struct usb_serial_port *port, struct file *filp) 1183{ 1184 struct usb_serial *serial; 1185 struct moschip_port *mos7840_port; 1186 int j; 1187 __u16 Data; 1188 1189 dbg("%s\n", "mos7840_close:entering..."); 1190 1191 if (mos7840_port_paranoia_check(port, __FUNCTION__)) { 1192 dbg("%s", "Port Paranoia failed \n"); 1193 return; 1194 } 1195 1196 serial = mos7840_get_usb_serial(port, __FUNCTION__); 1197 if (!serial) { 1198 dbg("%s", "Serial Paranoia failed \n"); 1199 return; 1200 } 1201 1202 mos7840_port = mos7840_get_port_private(port); 1203 1204 if (mos7840_port == NULL) { 1205 return; 1206 } 1207 1208 for (j = 0; j < NUM_URBS; ++j) 1209 usb_kill_urb(mos7840_port->write_urb_pool[j]); 1210 1211 /* Freeing Write URBs */ 1212 for (j = 0; j < NUM_URBS; ++j) { 1213 if (mos7840_port->write_urb_pool[j]) { 1214 if (mos7840_port->write_urb_pool[j]->transfer_buffer) 1215 kfree(mos7840_port->write_urb_pool[j]-> 1216 transfer_buffer); 1217 1218 usb_free_urb(mos7840_port->write_urb_pool[j]); 1219 } 1220 } 1221 1222 if (serial->dev) { 1223 /* flush and block until tx is empty */ 1224 mos7840_block_until_tx_empty(mos7840_port); 1225 } 1226 1227 /* While closing port, shutdown all bulk read, write * 1228 * and interrupt read if they exists */ 1229 if (serial->dev) { 1230 1231 if (mos7840_port->write_urb) { 1232 dbg("%s", "Shutdown bulk write\n"); 1233 usb_kill_urb(mos7840_port->write_urb); 1234 } 1235 1236 if (mos7840_port->read_urb) { 1237 dbg("%s", "Shutdown bulk read\n"); 1238 usb_kill_urb(mos7840_port->read_urb); 1239 } 1240 if ((&mos7840_port->control_urb)) { 1241 dbg("%s", "Shutdown control read\n"); 1242 // usb_kill_urb (mos7840_port->control_urb); 1243 1244 } 1245 } 1246// if(mos7840_port->ctrl_buf != NULL) 1247// kfree(mos7840_port->ctrl_buf); 1248 mos7840_num_open_ports--; 1249 dbg("mos7840_num_open_ports in close%d:in port%d\n", 1250 mos7840_num_open_ports, port->number); 1251 if (mos7840_num_open_ports == 0) { 1252 if (serial->port[0]->interrupt_in_urb) { 1253 dbg("%s", "Shutdown interrupt_in_urb\n"); 1254 } 1255 } 1256 1257 if (mos7840_port->write_urb) { 1258 /* if this urb had a transfer buffer already (old tx) free it */ 1259 1260 if (mos7840_port->write_urb->transfer_buffer != NULL) { 1261 kfree(mos7840_port->write_urb->transfer_buffer); 1262 } 1263 usb_free_urb(mos7840_port->write_urb); 1264 } 1265 1266 Data = 0x0; 1267 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data); 1268 1269 Data = 0x00; 1270 mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data); 1271 1272 mos7840_port->open = 0; 1273 1274 dbg("%s \n", "Leaving ............"); 1275} 1276 1277/************************************************************************ 1278 * 1279 * mos7840_block_until_chase_response 1280 * 1281 * This function will block the close until one of the following: 1282 * 1. Response to our Chase comes from mos7840 1283 * 2. A timout of 10 seconds without activity has expired 1284 * (1K of mos7840 data @ 2400 baud ==> 4 sec to empty) 1285 * 1286 ************************************************************************/ 1287 1288static void mos7840_block_until_chase_response(struct moschip_port 1289 *mos7840_port) 1290{ 1291 int timeout = 1 * HZ; 1292 int wait = 10; 1293 int count; 1294 1295 while (1) { 1296 count = mos7840_chars_in_buffer(mos7840_port->port); 1297 1298 /* Check for Buffer status */ 1299 if (count <= 0) { 1300 return; 1301 } 1302 1303 /* Block the thread for a while */ 1304 interruptible_sleep_on_timeout(&mos7840_port->wait_chase, 1305 timeout); 1306 /* No activity.. count down section */ 1307 wait--; 1308 if (wait == 0) { 1309 dbg("%s - TIMEOUT", __FUNCTION__); 1310 return; 1311 } else { 1312 /* Reset timout value back to seconds */ 1313 wait = 10; 1314 } 1315 } 1316 1317} 1318 1319/***************************************************************************** 1320 * mos7840_break 1321 * this function sends a break to the port 1322 *****************************************************************************/ 1323static void mos7840_break(struct usb_serial_port *port, int break_state) 1324{ 1325 unsigned char data; 1326 struct usb_serial *serial; 1327 struct moschip_port *mos7840_port; 1328 1329 dbg("%s \n", "Entering ..........."); 1330 dbg("mos7840_break: Start\n"); 1331 1332 if (mos7840_port_paranoia_check(port, __FUNCTION__)) { 1333 dbg("%s", "Port Paranoia failed \n"); 1334 return; 1335 } 1336 1337 serial = mos7840_get_usb_serial(port, __FUNCTION__); 1338 if (!serial) { 1339 dbg("%s", "Serial Paranoia failed \n"); 1340 return; 1341 } 1342 1343 mos7840_port = mos7840_get_port_private(port); 1344 1345 if (mos7840_port == NULL) { 1346 return; 1347 } 1348 1349 if (serial->dev) { 1350 1351 /* flush and block until tx is empty */ 1352 mos7840_block_until_chase_response(mos7840_port); 1353 } 1354 1355 if (break_state == -1) { 1356 data = mos7840_port->shadowLCR | LCR_SET_BREAK; 1357 } else { 1358 data = mos7840_port->shadowLCR & ~LCR_SET_BREAK; 1359 } 1360 1361 mos7840_port->shadowLCR = data; 1362 dbg("mcs7840_break mos7840_port->shadowLCR is %x\n", 1363 mos7840_port->shadowLCR); 1364 mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, 1365 mos7840_port->shadowLCR); 1366 1367 return; 1368} 1369 1370/***************************************************************************** 1371 * mos7840_write_room 1372 * this function is called by the tty driver when it wants to know how many 1373 * bytes of data we can accept for a specific port. 1374 * If successful, we return the amount of room that we have for this port 1375 * Otherwise we return a negative error number. 1376 *****************************************************************************/ 1377 1378static int mos7840_write_room(struct usb_serial_port *port) 1379{ 1380 int i; 1381 int room = 0; 1382 struct moschip_port *mos7840_port; 1383 1384 dbg("%s \n", " mos7840_write_room:entering ..........."); 1385 1386 if (mos7840_port_paranoia_check(port, __FUNCTION__)) { 1387 dbg("%s", "Invalid port \n"); 1388 dbg("%s \n", " mos7840_write_room:leaving ..........."); 1389 return -1; 1390 } 1391 1392 mos7840_port = mos7840_get_port_private(port); 1393 if (mos7840_port == NULL) { 1394 dbg("%s \n", "mos7840_break:leaving ..........."); 1395 return -1; 1396 } 1397 1398 for (i = 0; i < NUM_URBS; ++i) { 1399 if (mos7840_port->write_urb_pool[i]->status != -EINPROGRESS) { 1400 room += URB_TRANSFER_BUFFER_SIZE; 1401 } 1402 } 1403 1404 dbg("%s - returns %d", __FUNCTION__, room); 1405 return (room); 1406 1407} 1408 1409/***************************************************************************** 1410 * mos7840_write 1411 * this function is called by the tty driver when data should be written to 1412 * the port. 1413 * If successful, we return the number of bytes written, otherwise we 1414 * return a negative error number. 1415 *****************************************************************************/ 1416 1417static int mos7840_write(struct usb_serial_port *port, 1418 const unsigned char *data, int count) 1419{ 1420 int status; 1421 int i; 1422 int bytes_sent = 0; 1423 int transfer_size; 1424 int from_user = 0; 1425 1426 struct moschip_port *mos7840_port; 1427 struct usb_serial *serial; 1428 struct urb *urb; 1429 //__u16 Data; 1430 const unsigned char *current_position = data; 1431 unsigned char *data1; 1432 dbg("%s \n", "entering ..........."); 1433 //dbg("mos7840_write: mos7840_port->shadowLCR is %x\n",mos7840_port->shadowLCR); 1434 1435#ifdef NOTMOS7840 1436 Data = 0x00; 1437 status = 0; 1438 status = mos7840_get_uart_reg(port, LINE_CONTROL_REGISTER, &Data); 1439 mos7840_port->shadowLCR = Data; 1440 dbg("mos7840_write: LINE_CONTROL_REGISTER is %x\n", Data); 1441 dbg("mos7840_write: mos7840_port->shadowLCR is %x\n", 1442 mos7840_port->shadowLCR); 1443 1444 //Data = 0x03; 1445 //status = mos7840_set_uart_reg(port,LINE_CONTROL_REGISTER,Data); 1446 //mos7840_port->shadowLCR=Data;//Need to add later 1447 1448 Data |= SERIAL_LCR_DLAB; //data latch enable in LCR 0x80 1449 status = 0; 1450 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 1451 1452 //Data = 0x0c; 1453 //status = mos7840_set_uart_reg(port,DIVISOR_LATCH_LSB,Data); 1454 Data = 0x00; 1455 status = 0; 1456 status = mos7840_get_uart_reg(port, DIVISOR_LATCH_LSB, &Data); 1457 dbg("mos7840_write:DLL value is %x\n", Data); 1458 1459 Data = 0x0; 1460 status = 0; 1461 status = mos7840_get_uart_reg(port, DIVISOR_LATCH_MSB, &Data); 1462 dbg("mos7840_write:DLM value is %x\n", Data); 1463 1464 Data = Data & ~SERIAL_LCR_DLAB; 1465 dbg("mos7840_write: mos7840_port->shadowLCR is %x\n", 1466 mos7840_port->shadowLCR); 1467 status = 0; 1468 status = mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 1469#endif 1470 1471 if (mos7840_port_paranoia_check(port, __FUNCTION__)) { 1472 dbg("%s", "Port Paranoia failed \n"); 1473 return -1; 1474 } 1475 1476 serial = port->serial; 1477 if (mos7840_serial_paranoia_check(serial, __FUNCTION__)) { 1478 dbg("%s", "Serial Paranoia failed \n"); 1479 return -1; 1480 } 1481 1482 mos7840_port = mos7840_get_port_private(port); 1483 if (mos7840_port == NULL) { 1484 dbg("%s", "mos7840_port is NULL\n"); 1485 return -1; 1486 } 1487 1488 /* try to find a free urb in the list */ 1489 urb = NULL; 1490 1491 for (i = 0; i < NUM_URBS; ++i) { 1492 if (mos7840_port->write_urb_pool[i]->status != -EINPROGRESS) { 1493 urb = mos7840_port->write_urb_pool[i]; 1494 dbg("\nURB:%d", i); 1495 break; 1496 } 1497 } 1498 1499 if (urb == NULL) { 1500 dbg("%s - no more free urbs", __FUNCTION__); 1501 goto exit; 1502 } 1503 1504 if (urb->transfer_buffer == NULL) { 1505 urb->transfer_buffer = 1506 kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL); 1507 1508 if (urb->transfer_buffer == NULL) { 1509 err("%s no more kernel memory...", __FUNCTION__); 1510 goto exit; 1511 } 1512 } 1513 transfer_size = min(count, URB_TRANSFER_BUFFER_SIZE); 1514 1515 if (from_user) { 1516 if (copy_from_user 1517 (urb->transfer_buffer, current_position, transfer_size)) { 1518 bytes_sent = -EFAULT; 1519 goto exit; 1520 } 1521 } else { 1522 memcpy(urb->transfer_buffer, current_position, transfer_size); 1523 } 1524 1525 /* fill urb with data and submit */ 1526 usb_fill_bulk_urb(urb, 1527 serial->dev, 1528 usb_sndbulkpipe(serial->dev, 1529 port->bulk_out_endpointAddress), 1530 urb->transfer_buffer, 1531 transfer_size, 1532 mos7840_bulk_out_data_callback, mos7840_port); 1533 1534 data1 = urb->transfer_buffer; 1535 dbg("\nbulkout endpoint is %d", port->bulk_out_endpointAddress); 1536 1537 /* send it down the pipe */ 1538 status = usb_submit_urb(urb, GFP_ATOMIC); 1539 1540 if (status) { 1541 err("%s - usb_submit_urb(write bulk) failed with status = %d", 1542 __FUNCTION__, status); 1543 bytes_sent = status; 1544 goto exit; 1545 } 1546 bytes_sent = transfer_size; 1547 mos7840_port->icount.tx += transfer_size; 1548 dbg("mos7840_port->icount.tx is %d:\n", mos7840_port->icount.tx); 1549 exit: 1550 1551 return bytes_sent; 1552 1553} 1554 1555/***************************************************************************** 1556 * mos7840_throttle 1557 * this function is called by the tty driver when it wants to stop the data 1558 * being read from the port. 1559 *****************************************************************************/ 1560 1561static void mos7840_throttle(struct usb_serial_port *port) 1562{ 1563 struct moschip_port *mos7840_port; 1564 struct tty_struct *tty; 1565 int status; 1566 1567 if (mos7840_port_paranoia_check(port, __FUNCTION__)) { 1568 dbg("%s", "Invalid port \n"); 1569 return; 1570 } 1571 1572 dbg("- port %d\n", port->number); 1573 1574 mos7840_port = mos7840_get_port_private(port); 1575 1576 if (mos7840_port == NULL) 1577 return; 1578 1579 if (!mos7840_port->open) { 1580 dbg("%s\n", "port not opened"); 1581 return; 1582 } 1583 1584 dbg("%s", "Entering .......... \n"); 1585 1586 tty = port->tty; 1587 if (!tty) { 1588 dbg("%s - no tty available", __FUNCTION__); 1589 return; 1590 } 1591 1592 /* if we are implementing XON/XOFF, send the stop character */ 1593 if (I_IXOFF(tty)) { 1594 unsigned char stop_char = STOP_CHAR(tty); 1595 status = mos7840_write(port, &stop_char, 1); 1596 if (status <= 0) { 1597 return; 1598 } 1599 } 1600 1601 /* if we are implementing RTS/CTS, toggle that line */ 1602 if (tty->termios->c_cflag & CRTSCTS) { 1603 mos7840_port->shadowMCR &= ~MCR_RTS; 1604 status = 0; 1605 status = 1606 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, 1607 mos7840_port->shadowMCR); 1608 1609 if (status < 0) { 1610 return; 1611 } 1612 } 1613 1614 return; 1615} 1616 1617/***************************************************************************** 1618 * mos7840_unthrottle 1619 * this function is called by the tty driver when it wants to resume the data 1620 * being read from the port (called after SerialThrottle is called) 1621 *****************************************************************************/ 1622static void mos7840_unthrottle(struct usb_serial_port *port) 1623{ 1624 struct tty_struct *tty; 1625 int status; 1626 struct moschip_port *mos7840_port = mos7840_get_port_private(port); 1627 1628 if (mos7840_port_paranoia_check(port, __FUNCTION__)) { 1629 dbg("%s", "Invalid port \n"); 1630 return; 1631 } 1632 1633 if (mos7840_port == NULL) 1634 return; 1635 1636 if (!mos7840_port->open) { 1637 dbg("%s - port not opened", __FUNCTION__); 1638 return; 1639 } 1640 1641 dbg("%s", "Entering .......... \n"); 1642 1643 tty = port->tty; 1644 if (!tty) { 1645 dbg("%s - no tty available", __FUNCTION__); 1646 return; 1647 } 1648 1649 /* if we are implementing XON/XOFF, send the start character */ 1650 if (I_IXOFF(tty)) { 1651 unsigned char start_char = START_CHAR(tty); 1652 status = mos7840_write(port, &start_char, 1); 1653 if (status <= 0) { 1654 return; 1655 } 1656 } 1657 1658 /* if we are implementing RTS/CTS, toggle that line */ 1659 if (tty->termios->c_cflag & CRTSCTS) { 1660 mos7840_port->shadowMCR |= MCR_RTS; 1661 status = 0; 1662 status = 1663 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, 1664 mos7840_port->shadowMCR); 1665 if (status < 0) { 1666 return; 1667 } 1668 } 1669 1670 return; 1671} 1672 1673static int mos7840_tiocmget(struct usb_serial_port *port, struct file *file) 1674{ 1675 struct moschip_port *mos7840_port; 1676 unsigned int result; 1677 __u16 msr; 1678 __u16 mcr; 1679 int status = 0; 1680 mos7840_port = mos7840_get_port_private(port); 1681 1682 dbg("%s - port %d", __FUNCTION__, port->number); 1683 1684 if (mos7840_port == NULL) 1685 return -ENODEV; 1686 1687 status = mos7840_get_uart_reg(port, MODEM_STATUS_REGISTER, &msr); 1688 status = mos7840_get_uart_reg(port, MODEM_CONTROL_REGISTER, &mcr); 1689 result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0) 1690 | ((mcr & MCR_RTS) ? TIOCM_RTS : 0) 1691 | ((mcr & MCR_LOOPBACK) ? TIOCM_LOOP : 0) 1692 | ((msr & MOS7840_MSR_CTS) ? TIOCM_CTS : 0) 1693 | ((msr & MOS7840_MSR_CD) ? TIOCM_CAR : 0) 1694 | ((msr & MOS7840_MSR_RI) ? TIOCM_RI : 0) 1695 | ((msr & MOS7840_MSR_DSR) ? TIOCM_DSR : 0); 1696 1697 dbg("%s - 0x%04X", __FUNCTION__, result); 1698 1699 return result; 1700} 1701 1702static int mos7840_tiocmset(struct usb_serial_port *port, struct file *file, 1703 unsigned int set, unsigned int clear) 1704{ 1705 struct moschip_port *mos7840_port; 1706 unsigned int mcr; 1707 unsigned int status; 1708 1709 dbg("%s - port %d", __FUNCTION__, port->number); 1710 1711 mos7840_port = mos7840_get_port_private(port); 1712 1713 if (mos7840_port == NULL) 1714 return -ENODEV; 1715 1716 mcr = mos7840_port->shadowMCR; 1717 if (clear & TIOCM_RTS) 1718 mcr &= ~MCR_RTS; 1719 if (clear & TIOCM_DTR) 1720 mcr &= ~MCR_DTR; 1721 if (clear & TIOCM_LOOP) 1722 mcr &= ~MCR_LOOPBACK; 1723 1724 if (set & TIOCM_RTS) 1725 mcr |= MCR_RTS; 1726 if (set & TIOCM_DTR) 1727 mcr |= MCR_DTR; 1728 if (set & TIOCM_LOOP) 1729 mcr |= MCR_LOOPBACK; 1730 1731 mos7840_port->shadowMCR = mcr; 1732 1733 status = 0; 1734 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, mcr); 1735 if (status < 0) { 1736 dbg("setting MODEM_CONTROL_REGISTER Failed\n"); 1737 return -1; 1738 } 1739 1740 return 0; 1741} 1742 1743/***************************************************************************** 1744 * mos7840_calc_baud_rate_divisor 1745 * this function calculates the proper baud rate divisor for the specified 1746 * baud rate. 1747 *****************************************************************************/ 1748static int mos7840_calc_baud_rate_divisor(int baudRate, int *divisor, 1749 __u16 * clk_sel_val) 1750{ 1751 1752 dbg("%s - %d", __FUNCTION__, baudRate); 1753 1754 if (baudRate <= 115200) { 1755 *divisor = 115200 / baudRate; 1756 *clk_sel_val = 0x0; 1757 } 1758 if ((baudRate > 115200) && (baudRate <= 230400)) { 1759 *divisor = 230400 / baudRate; 1760 *clk_sel_val = 0x10; 1761 } else if ((baudRate > 230400) && (baudRate <= 403200)) { 1762 *divisor = 403200 / baudRate; 1763 *clk_sel_val = 0x20; 1764 } else if ((baudRate > 403200) && (baudRate <= 460800)) { 1765 *divisor = 460800 / baudRate; 1766 *clk_sel_val = 0x30; 1767 } else if ((baudRate > 460800) && (baudRate <= 806400)) { 1768 *divisor = 806400 / baudRate; 1769 *clk_sel_val = 0x40; 1770 } else if ((baudRate > 806400) && (baudRate <= 921600)) { 1771 *divisor = 921600 / baudRate; 1772 *clk_sel_val = 0x50; 1773 } else if ((baudRate > 921600) && (baudRate <= 1572864)) { 1774 *divisor = 1572864 / baudRate; 1775 *clk_sel_val = 0x60; 1776 } else if ((baudRate > 1572864) && (baudRate <= 3145728)) { 1777 *divisor = 3145728 / baudRate; 1778 *clk_sel_val = 0x70; 1779 } 1780 return 0; 1781 1782#ifdef NOTMCS7840 1783 1784 for (i = 0; i < ARRAY_SIZE(mos7840_divisor_table); i++) { 1785 if (mos7840_divisor_table[i].BaudRate == baudrate) { 1786 *divisor = mos7840_divisor_table[i].Divisor; 1787 return 0; 1788 } 1789 } 1790 1791 /* After trying for all the standard baud rates * 1792 * Try calculating the divisor for this baud rate */ 1793 1794 if (baudrate > 75 && baudrate < 230400) { 1795 /* get the divisor */ 1796 custom = (__u16) (230400L / baudrate); 1797 1798 /* Check for round off */ 1799 round1 = (__u16) (2304000L / baudrate); 1800 round = (__u16) (round1 - (custom * 10)); 1801 if (round > 4) { 1802 custom++; 1803 } 1804 *divisor = custom; 1805 1806 dbg(" Baud %d = %d\n", baudrate, custom); 1807 return 0; 1808 } 1809 1810 dbg("%s\n", " Baud calculation Failed..."); 1811 return -1; 1812#endif 1813} 1814 1815/***************************************************************************** 1816 * mos7840_send_cmd_write_baud_rate 1817 * this function sends the proper command to change the baud rate of the 1818 * specified port. 1819 *****************************************************************************/ 1820 1821static int mos7840_send_cmd_write_baud_rate(struct moschip_port *mos7840_port, 1822 int baudRate) 1823{ 1824 int divisor = 0; 1825 int status; 1826 __u16 Data; 1827 unsigned char number; 1828 __u16 clk_sel_val; 1829 struct usb_serial_port *port; 1830 1831 if (mos7840_port == NULL) 1832 return -1; 1833 1834 port = (struct usb_serial_port *)mos7840_port->port; 1835 if (mos7840_port_paranoia_check(port, __FUNCTION__)) { 1836 dbg("%s", "Invalid port \n"); 1837 return -1; 1838 } 1839 1840 if (mos7840_serial_paranoia_check(port->serial, __FUNCTION__)) { 1841 dbg("%s", "Invalid Serial \n"); 1842 return -1; 1843 } 1844 1845 dbg("%s", "Entering .......... \n"); 1846 1847 number = mos7840_port->port->number - mos7840_port->port->serial->minor; 1848 1849 dbg("%s - port = %d, baud = %d", __FUNCTION__, 1850 mos7840_port->port->number, baudRate); 1851 //reset clk_uart_sel in spregOffset 1852 if (baudRate > 115200) { 1853#ifdef HW_flow_control 1854 //NOTE: need to see the pther register to modify 1855 //setting h/w flow control bit to 1; 1856 status = 0; 1857 Data = 0x2b; 1858 mos7840_port->shadowMCR = Data; 1859 status = 1860 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data); 1861 if (status < 0) { 1862 dbg("Writing spreg failed in set_serial_baud\n"); 1863 return -1; 1864 } 1865#endif 1866 1867 } else { 1868#ifdef HW_flow_control 1869 //setting h/w flow control bit to 0; 1870 status = 0; 1871 Data = 0xb; 1872 mos7840_port->shadowMCR = Data; 1873 status = 1874 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data); 1875 if (status < 0) { 1876 dbg("Writing spreg failed in set_serial_baud\n"); 1877 return -1; 1878 } 1879#endif 1880 1881 } 1882 1883 if (1) //baudRate <= 115200) 1884 { 1885 clk_sel_val = 0x0; 1886 Data = 0x0; 1887 status = 0; 1888 status = 1889 mos7840_calc_baud_rate_divisor(baudRate, &divisor, 1890 &clk_sel_val); 1891 status = 1892 mos7840_get_reg_sync(port, mos7840_port->SpRegOffset, 1893 &Data); 1894 if (status < 0) { 1895 dbg("reading spreg failed in set_serial_baud\n"); 1896 return -1; 1897 } 1898 Data = (Data & 0x8f) | clk_sel_val; 1899 status = 0; 1900 status = 1901 mos7840_set_reg_sync(port, mos7840_port->SpRegOffset, Data); 1902 if (status < 0) { 1903 dbg("Writing spreg failed in set_serial_baud\n"); 1904 return -1; 1905 } 1906 /* Calculate the Divisor */ 1907 1908 if (status) { 1909 err("%s - bad baud rate", __FUNCTION__); 1910 dbg("%s\n", "bad baud rate"); 1911 return status; 1912 } 1913 /* Enable access to divisor latch */ 1914 Data = mos7840_port->shadowLCR | SERIAL_LCR_DLAB; 1915 mos7840_port->shadowLCR = Data; 1916 mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 1917 1918 /* Write the divisor */ 1919 Data = (unsigned char)(divisor & 0xff); 1920 dbg("set_serial_baud Value to write DLL is %x\n", Data); 1921 mos7840_set_uart_reg(port, DIVISOR_LATCH_LSB, Data); 1922 1923 Data = (unsigned char)((divisor & 0xff00) >> 8); 1924 dbg("set_serial_baud Value to write DLM is %x\n", Data); 1925 mos7840_set_uart_reg(port, DIVISOR_LATCH_MSB, Data); 1926 1927 /* Disable access to divisor latch */ 1928 Data = mos7840_port->shadowLCR & ~SERIAL_LCR_DLAB; 1929 mos7840_port->shadowLCR = Data; 1930 mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 1931 1932 } 1933 1934 return status; 1935} 1936 1937/***************************************************************************** 1938 * mos7840_change_port_settings 1939 * This routine is called to set the UART on the device to match 1940 * the specified new settings. 1941 *****************************************************************************/ 1942 1943static void mos7840_change_port_settings(struct moschip_port *mos7840_port, 1944 struct termios *old_termios) 1945{ 1946 struct tty_struct *tty; 1947 int baud; 1948 unsigned cflag; 1949 unsigned iflag; 1950 __u8 lData; 1951 __u8 lParity; 1952 __u8 lStop; 1953 int status; 1954 __u16 Data; 1955 struct usb_serial_port *port; 1956 struct usb_serial *serial; 1957 1958 if (mos7840_port == NULL) 1959 return; 1960 1961 port = (struct usb_serial_port *)mos7840_port->port; 1962 1963 if (mos7840_port_paranoia_check(port, __FUNCTION__)) { 1964 dbg("%s", "Invalid port \n"); 1965 return; 1966 } 1967 1968 if (mos7840_serial_paranoia_check(port->serial, __FUNCTION__)) { 1969 dbg("%s", "Invalid Serial \n"); 1970 return; 1971 } 1972 1973 serial = port->serial; 1974 1975 dbg("%s - port %d", __FUNCTION__, mos7840_port->port->number); 1976 1977 if (!mos7840_port->open) { 1978 dbg("%s - port not opened", __FUNCTION__); 1979 return; 1980 } 1981 1982 tty = mos7840_port->port->tty; 1983 1984 if ((!tty) || (!tty->termios)) { 1985 dbg("%s - no tty structures", __FUNCTION__); 1986 return; 1987 } 1988 1989 dbg("%s", "Entering .......... \n"); 1990 1991 lData = LCR_BITS_8; 1992 lStop = LCR_STOP_1; 1993 lParity = LCR_PAR_NONE; 1994 1995 cflag = tty->termios->c_cflag; 1996 iflag = tty->termios->c_iflag; 1997 1998 /* Change the number of bits */ 1999 if (cflag & CSIZE) { 2000 switch (cflag & CSIZE) { 2001 case CS5: 2002 lData = LCR_BITS_5; 2003 break; 2004 2005 case CS6: 2006 lData = LCR_BITS_6; 2007 break; 2008 2009 case CS7: 2010 lData = LCR_BITS_7; 2011 break; 2012 default: 2013 case CS8: 2014 lData = LCR_BITS_8; 2015 break; 2016 } 2017 } 2018 /* Change the Parity bit */ 2019 if (cflag & PARENB) { 2020 if (cflag & PARODD) { 2021 lParity = LCR_PAR_ODD; 2022 dbg("%s - parity = odd", __FUNCTION__); 2023 } else { 2024 lParity = LCR_PAR_EVEN; 2025 dbg("%s - parity = even", __FUNCTION__); 2026 } 2027 2028 } else { 2029 dbg("%s - parity = none", __FUNCTION__); 2030 } 2031 2032 if (cflag & CMSPAR) { 2033 lParity = lParity | 0x20; 2034 } 2035 2036 /* Change the Stop bit */ 2037 if (cflag & CSTOPB) { 2038 lStop = LCR_STOP_2; 2039 dbg("%s - stop bits = 2", __FUNCTION__); 2040 } else { 2041 lStop = LCR_STOP_1; 2042 dbg("%s - stop bits = 1", __FUNCTION__); 2043 } 2044 2045 /* Update the LCR with the correct value */ 2046 mos7840_port->shadowLCR &= 2047 ~(LCR_BITS_MASK | LCR_STOP_MASK | LCR_PAR_MASK); 2048 mos7840_port->shadowLCR |= (lData | lParity | lStop); 2049 2050 dbg("mos7840_change_port_settings mos7840_port->shadowLCR is %x\n", 2051 mos7840_port->shadowLCR); 2052 /* Disable Interrupts */ 2053 Data = 0x00; 2054 mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data); 2055 2056 Data = 0x00; 2057 mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data); 2058 2059 Data = 0xcf; 2060 mos7840_set_uart_reg(port, FIFO_CONTROL_REGISTER, Data); 2061 2062 /* Send the updated LCR value to the mos7840 */ 2063 Data = mos7840_port->shadowLCR; 2064 2065 mos7840_set_uart_reg(port, LINE_CONTROL_REGISTER, Data); 2066 2067 Data = 0x00b; 2068 mos7840_port->shadowMCR = Data; 2069 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data); 2070 Data = 0x00b; 2071 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data); 2072 2073 /* set up the MCR register and send it to the mos7840 */ 2074 2075 mos7840_port->shadowMCR = MCR_MASTER_IE; 2076 if (cflag & CBAUD) { 2077 mos7840_port->shadowMCR |= (MCR_DTR | MCR_RTS); 2078 } 2079 2080 if (cflag & CRTSCTS) { 2081 mos7840_port->shadowMCR |= (MCR_XON_ANY); 2082 2083 } else { 2084 mos7840_port->shadowMCR &= ~(MCR_XON_ANY); 2085 } 2086 2087 Data = mos7840_port->shadowMCR; 2088 mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data); 2089 2090 /* Determine divisor based on baud rate */ 2091 baud = tty_get_baud_rate(tty); 2092 2093 if (!baud) { 2094 /* pick a default, any default... */ 2095 dbg("%s\n", "Picked default baud..."); 2096 baud = 9600; 2097 } 2098 2099 dbg("%s - baud rate = %d", __FUNCTION__, baud); 2100 status = mos7840_send_cmd_write_baud_rate(mos7840_port, baud); 2101 2102 /* Enable Interrupts */ 2103 Data = 0x0c; 2104 mos7840_set_uart_reg(port, INTERRUPT_ENABLE_REGISTER, Data); 2105 2106 if (mos7840_port->read_urb->status != -EINPROGRESS) { 2107 mos7840_port->read_urb->dev = serial->dev; 2108 2109 status = usb_submit_urb(mos7840_port->read_urb, GFP_ATOMIC); 2110 2111 if (status) { 2112 dbg(" usb_submit_urb(read bulk) failed, status = %d", 2113 status); 2114 } 2115 } 2116 wake_up(&mos7840_port->delta_msr_wait); 2117 mos7840_port->delta_msr_cond = 1; 2118 dbg("mos7840_change_port_settings mos7840_port->shadowLCR is End %x\n", 2119 mos7840_port->shadowLCR); 2120 2121 return; 2122} 2123 2124/***************************************************************************** 2125 * mos7840_set_termios 2126 * this function is called by the tty driver when it wants to change 2127 * the termios structure 2128 *****************************************************************************/ 2129 2130static void mos7840_set_termios(struct usb_serial_port *port, 2131 struct termios *old_termios) 2132{ 2133 int status; 2134 unsigned int cflag; 2135 struct usb_serial *serial; 2136 struct moschip_port *mos7840_port; 2137 struct tty_struct *tty; 2138 dbg("mos7840_set_termios: START\n"); 2139 if (mos7840_port_paranoia_check(port, __FUNCTION__)) { 2140 dbg("%s", "Invalid port \n"); 2141 return; 2142 } 2143 2144 serial = port->serial; 2145 2146 if (mos7840_serial_paranoia_check(serial, __FUNCTION__)) { 2147 dbg("%s", "Invalid Serial \n"); 2148 return; 2149 } 2150 2151 mos7840_port = mos7840_get_port_private(port); 2152 2153 if (mos7840_port == NULL) 2154 return; 2155 2156 tty = port->tty; 2157 2158 if (!port->tty || !port->tty->termios) { 2159 dbg("%s - no tty or termios", __FUNCTION__); 2160 return; 2161 } 2162 2163 if (!mos7840_port->open) { 2164 dbg("%s - port not opened", __FUNCTION__); 2165 return; 2166 } 2167 2168 dbg("%s\n", "setting termios - "); 2169 2170 cflag = tty->termios->c_cflag; 2171 2172 if (!cflag) { 2173 dbg("%s %s\n", __FUNCTION__, "cflag is NULL"); 2174 return; 2175 } 2176 2177 /* check that they really want us to change something */ 2178 if (old_termios) { 2179 if ((cflag == old_termios->c_cflag) && 2180 (RELEVANT_IFLAG(tty->termios->c_iflag) == 2181 RELEVANT_IFLAG(old_termios->c_iflag))) { 2182 dbg("%s\n", "Nothing to change"); 2183 return; 2184 } 2185 } 2186 2187 dbg("%s - clfag %08x iflag %08x", __FUNCTION__, 2188 tty->termios->c_cflag, RELEVANT_IFLAG(tty->termios->c_iflag)); 2189 2190 if (old_termios) { 2191 dbg("%s - old clfag %08x old iflag %08x", __FUNCTION__, 2192 old_termios->c_cflag, RELEVANT_IFLAG(old_termios->c_iflag)); 2193 } 2194 2195 dbg("%s - port %d", __FUNCTION__, port->number); 2196 2197 /* change the port settings to the new ones specified */ 2198 2199 mos7840_change_port_settings(mos7840_port, old_termios); 2200 2201 if (!mos7840_port->read_urb) { 2202 dbg("%s", "URB KILLED !!!!!\n"); 2203 return; 2204 } 2205 2206 if (mos7840_port->read_urb->status != -EINPROGRESS) { 2207 mos7840_port->read_urb->dev = serial->dev; 2208 status = usb_submit_urb(mos7840_port->read_urb, GFP_ATOMIC); 2209 if (status) { 2210 dbg(" usb_submit_urb(read bulk) failed, status = %d", 2211 status); 2212 } 2213 } 2214 return; 2215} 2216 2217/***************************************************************************** 2218 * mos7840_get_lsr_info - get line status register info 2219 * 2220 * Purpose: Let user call ioctl() to get info when the UART physically 2221 * is emptied. On bus types like RS485, the transmitter must 2222 * release the bus after transmitting. This must be done when 2223 * the transmit shift register is empty, not be done when the 2224 * transmit holding register is empty. This functionality 2225 * allows an RS485 driver to be written in user space. 2226 *****************************************************************************/ 2227 2228static int mos7840_get_lsr_info(struct moschip_port *mos7840_port, 2229 unsigned int *value) 2230{ 2231 int count; 2232 unsigned int result = 0; 2233 2234 count = mos7840_chars_in_buffer(mos7840_port->port); 2235 if (count == 0) { 2236 dbg("%s -- Empty", __FUNCTION__); 2237 result = TIOCSER_TEMT; 2238 } 2239 2240 if (copy_to_user(value, &result, sizeof(int))) 2241 return -EFAULT; 2242 return 0; 2243} 2244 2245/***************************************************************************** 2246 * mos7840_get_bytes_avail - get number of bytes available 2247 * 2248 * Purpose: Let user call ioctl to get the count of number of bytes available. 2249 *****************************************************************************/ 2250 2251static int mos7840_get_bytes_avail(struct moschip_port *mos7840_port, 2252 unsigned int *value) 2253{ 2254 unsigned int result = 0; 2255 struct tty_struct *tty = mos7840_port->port->tty; 2256 2257 if (!tty) 2258 return -ENOIOCTLCMD; 2259 2260 result = tty->read_cnt; 2261 2262 dbg("%s(%d) = %d", __FUNCTION__, mos7840_port->port->number, result); 2263 if (copy_to_user(value, &result, sizeof(int))) 2264 return -EFAULT; 2265 2266 return -ENOIOCTLCMD; 2267} 2268 2269/***************************************************************************** 2270 * mos7840_set_modem_info 2271 * function to set modem info 2272 *****************************************************************************/ 2273 2274static int mos7840_set_modem_info(struct moschip_port *mos7840_port, 2275 unsigned int cmd, unsigned int *value) 2276{ 2277 unsigned int mcr; 2278 unsigned int arg; 2279 __u16 Data; 2280 int status; 2281 struct usb_serial_port *port; 2282 2283 if (mos7840_port == NULL) 2284 return -1; 2285 2286 port = (struct usb_serial_port *)mos7840_port->port; 2287 if (mos7840_port_paranoia_check(port, __FUNCTION__)) { 2288 dbg("%s", "Invalid port \n"); 2289 return -1; 2290 } 2291 2292 mcr = mos7840_port->shadowMCR; 2293 2294 if (copy_from_user(&arg, value, sizeof(int))) 2295 return -EFAULT; 2296 2297 switch (cmd) { 2298 case TIOCMBIS: 2299 if (arg & TIOCM_RTS) 2300 mcr |= MCR_RTS; 2301 if (arg & TIOCM_DTR) 2302 mcr |= MCR_RTS; 2303 if (arg & TIOCM_LOOP) 2304 mcr |= MCR_LOOPBACK; 2305 break; 2306 2307 case TIOCMBIC: 2308 if (arg & TIOCM_RTS) 2309 mcr &= ~MCR_RTS; 2310 if (arg & TIOCM_DTR) 2311 mcr &= ~MCR_RTS; 2312 if (arg & TIOCM_LOOP) 2313 mcr &= ~MCR_LOOPBACK; 2314 break; 2315 2316 case TIOCMSET: 2317 /* turn off the RTS and DTR and LOOPBACK 2318 * and then only turn on what was asked to */ 2319 mcr &= ~(MCR_RTS | MCR_DTR | MCR_LOOPBACK); 2320 mcr |= ((arg & TIOCM_RTS) ? MCR_RTS : 0); 2321 mcr |= ((arg & TIOCM_DTR) ? MCR_DTR : 0); 2322 mcr |= ((arg & TIOCM_LOOP) ? MCR_LOOPBACK : 0); 2323 break; 2324 } 2325 2326 mos7840_port->shadowMCR = mcr; 2327 2328 Data = mos7840_port->shadowMCR; 2329 status = 0; 2330 status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER, Data); 2331 if (status < 0) { 2332 dbg("setting MODEM_CONTROL_REGISTER Failed\n"); 2333 return -1; 2334 } 2335 2336 return 0; 2337} 2338 2339/***************************************************************************** 2340 * mos7840_get_modem_info 2341 * function to get modem info 2342 *****************************************************************************/ 2343 2344static int mos7840_get_modem_info(struct moschip_port *mos7840_port, 2345 unsigned int *value) 2346{ 2347 unsigned int result = 0; 2348 __u16 msr; 2349 unsigned int mcr = mos7840_port->shadowMCR; 2350 int status = 0; 2351 status = 2352 mos7840_get_uart_reg(mos7840_port->port, MODEM_STATUS_REGISTER, 2353 &msr); 2354 result = ((mcr & MCR_DTR) ? TIOCM_DTR : 0) /* 0x002 */ 2355 |((mcr & MCR_RTS) ? TIOCM_RTS : 0) /* 0x004 */ 2356 |((msr & MOS7840_MSR_CTS) ? TIOCM_CTS : 0) /* 0x020 */ 2357 |((msr & MOS7840_MSR_CD) ? TIOCM_CAR : 0) /* 0x040 */ 2358 |((msr & MOS7840_MSR_RI) ? TIOCM_RI : 0) /* 0x080 */ 2359 |((msr & MOS7840_MSR_DSR) ? TIOCM_DSR : 0); /* 0x100 */ 2360 2361 dbg("%s -- %x", __FUNCTION__, result); 2362 2363 if (copy_to_user(value, &result, sizeof(int))) 2364 return -EFAULT; 2365 return 0; 2366} 2367 2368/***************************************************************************** 2369 * mos7840_get_serial_info 2370 * function to get information about serial port 2371 *****************************************************************************/ 2372 2373static int mos7840_get_serial_info(struct moschip_port *mos7840_port, 2374 struct serial_struct *retinfo) 2375{ 2376 struct serial_struct tmp; 2377 2378 if (mos7840_port == NULL) 2379 return -1; 2380 2381 if (!retinfo) 2382 return -EFAULT; 2383 2384 memset(&tmp, 0, sizeof(tmp)); 2385 2386 tmp.type = PORT_16550A; 2387 tmp.line = mos7840_port->port->serial->minor; 2388 tmp.port = mos7840_port->port->number; 2389 tmp.irq = 0; 2390 tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ; 2391 tmp.xmit_fifo_size = NUM_URBS * URB_TRANSFER_BUFFER_SIZE; 2392 tmp.baud_base = 9600; 2393 tmp.close_delay = 5 * HZ; 2394 tmp.closing_wait = 30 * HZ; 2395 2396 if (copy_to_user(retinfo, &tmp, sizeof(*retinfo))) 2397 return -EFAULT; 2398 return 0; 2399} 2400 2401/***************************************************************************** 2402 * SerialIoctl 2403 * this function handles any ioctl calls to the driver 2404 *****************************************************************************/ 2405 2406static int mos7840_ioctl(struct usb_serial_port *port, struct file *file, 2407 unsigned int cmd, unsigned long arg) 2408{ 2409 struct moschip_port *mos7840_port; 2410 struct tty_struct *tty; 2411 2412 struct async_icount cnow; 2413 struct async_icount cprev; 2414 struct serial_icounter_struct icount; 2415 int mosret = 0; 2416 int retval; 2417 struct tty_ldisc *ld; 2418 2419 if (mos7840_port_paranoia_check(port, __FUNCTION__)) { 2420 dbg("%s", "Invalid port \n"); 2421 return -1; 2422 } 2423 2424 mos7840_port = mos7840_get_port_private(port); 2425 tty = mos7840_port->port->tty; 2426 2427 if (mos7840_port == NULL) 2428 return -1; 2429 2430 dbg("%s - port %d, cmd = 0x%x", __FUNCTION__, port->number, cmd); 2431 2432 switch (cmd) { 2433 /* return number of bytes available */ 2434 2435 case TIOCINQ: 2436 dbg("%s (%d) TIOCINQ", __FUNCTION__, port->number); 2437 return mos7840_get_bytes_avail(mos7840_port, 2438 (unsigned int *)arg); 2439 break; 2440 2441 case TIOCOUTQ: 2442 dbg("%s (%d) TIOCOUTQ", __FUNCTION__, port->number); 2443 return put_user(tty->driver->chars_in_buffer ? 2444 tty->driver->chars_in_buffer(tty) : 0, 2445 (int __user *)arg); 2446 break; 2447 2448 case TCFLSH: 2449 retval = tty_check_change(tty); 2450 if (retval) 2451 return retval; 2452 2453 ld = tty_ldisc_ref(tty); 2454 switch (arg) { 2455 case TCIFLUSH: 2456 if (ld && ld->flush_buffer) 2457 ld->flush_buffer(tty); 2458 break; 2459 case TCIOFLUSH: 2460 if (ld && ld->flush_buffer) 2461 ld->flush_buffer(tty); 2462 /* fall through */ 2463 case TCOFLUSH: 2464 if (tty->driver->flush_buffer) 2465 tty->driver->flush_buffer(tty); 2466 break; 2467 default: 2468 tty_ldisc_deref(ld); 2469 return -EINVAL; 2470 } 2471 tty_ldisc_deref(ld); 2472 return 0; 2473 2474 case TCGETS: 2475 if (kernel_termios_to_user_termios 2476 ((struct termios __user *)arg, tty->termios)) 2477 return -EFAULT; 2478 return 0; 2479 2480 case TIOCSERGETLSR: 2481 dbg("%s (%d) TIOCSERGETLSR", __FUNCTION__, port->number); 2482 return mos7840_get_lsr_info(mos7840_port, (unsigned int *)arg); 2483 return 0; 2484 2485 case TIOCMBIS: 2486 case TIOCMBIC: 2487 case TIOCMSET: 2488 dbg("%s (%d) TIOCMSET/TIOCMBIC/TIOCMSET", __FUNCTION__, 2489 port->number); 2490 mosret = 2491 mos7840_set_modem_info(mos7840_port, cmd, 2492 (unsigned int *)arg); 2493 return mosret; 2494 2495 case TIOCMGET: 2496 dbg("%s (%d) TIOCMGET", __FUNCTION__, port->number); 2497 return mos7840_get_modem_info(mos7840_port, 2498 (unsigned int *)arg); 2499 2500 case TIOCGSERIAL: 2501 dbg("%s (%d) TIOCGSERIAL", __FUNCTION__, port->number); 2502 return mos7840_get_serial_info(mos7840_port, 2503 (struct serial_struct *)arg); 2504 2505 case TIOCSSERIAL: 2506 dbg("%s (%d) TIOCSSERIAL", __FUNCTION__, port->number); 2507 break; 2508 2509 case TIOCMIWAIT: 2510 dbg("%s (%d) TIOCMIWAIT", __FUNCTION__, port->number); 2511 cprev = mos7840_port->icount; 2512 while (1) { 2513 //interruptible_sleep_on(&mos7840_port->delta_msr_wait); 2514 mos7840_port->delta_msr_cond = 0; 2515 wait_event_interruptible(mos7840_port->delta_msr_wait, 2516 (mos7840_port-> 2517 delta_msr_cond == 1)); 2518 2519 /* see if a signal did it */ 2520 if (signal_pending(current)) 2521 return -ERESTARTSYS; 2522 cnow = mos7840_port->icount; 2523 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && 2524 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) 2525 return -EIO; /* no change => error */ 2526 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) || 2527 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) || 2528 ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) || 2529 ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts))) { 2530 return 0; 2531 } 2532 cprev = cnow; 2533 } 2534 /* NOTREACHED */ 2535 break; 2536 2537 case TIOCGICOUNT: 2538 cnow = mos7840_port->icount; 2539 icount.cts = cnow.cts; 2540 icount.dsr = cnow.dsr; 2541 icount.rng = cnow.rng; 2542 icount.dcd = cnow.dcd; 2543 icount.rx = cnow.rx; 2544 icount.tx = cnow.tx; 2545 icount.frame = cnow.frame; 2546 icount.overrun = cnow.overrun; 2547 icount.parity = cnow.parity; 2548 icount.brk = cnow.brk; 2549 icount.buf_overrun = cnow.buf_overrun; 2550 2551 dbg("%s (%d) TIOCGICOUNT RX=%d, TX=%d", __FUNCTION__, 2552 port->number, icount.rx, icount.tx); 2553 if (copy_to_user((void *)arg, &icount, sizeof(icount))) 2554 return -EFAULT; 2555 return 0; 2556 2557 case TIOCEXBAUD: 2558 return 0; 2559 default: 2560 break; 2561 } 2562 2563 return -ENOIOCTLCMD; 2564} 2565 2566static int mos7840_calc_num_ports(struct usb_serial *serial) 2567{ 2568 2569 dbg("numberofendpoints: %d \n", 2570 (int)serial->interface->cur_altsetting->desc.bNumEndpoints); 2571 dbg("numberofendpoints: %d \n", 2572 (int)serial->interface->altsetting->desc.bNumEndpoints); 2573 if (serial->interface->cur_altsetting->desc.bNumEndpoints == 5) { 2574 mos7840_num_ports = 2; 2575 serial->type->num_ports = 2; 2576 } else if (serial->interface->cur_altsetting->desc.bNumEndpoints == 9) { 2577 mos7840_num_ports = 4; 2578 serial->type->num_bulk_in = 4; 2579 serial->type->num_bulk_out = 4; 2580 serial->type->num_ports = 4; 2581 } 2582 2583 return mos7840_num_ports; 2584} 2585 2586/**************************************************************************** 2587 * mos7840_startup 2588 ****************************************************************************/ 2589 2590static int mos7840_startup(struct usb_serial *serial) 2591{ 2592 struct moschip_port *mos7840_port; 2593 struct usb_device *dev; 2594 int i, status; 2595 2596 __u16 Data; 2597 dbg("%s \n", " mos7840_startup :entering.........."); 2598 2599 if (!serial) { 2600 dbg("%s\n", "Invalid Handler"); 2601 return -1; 2602 } 2603 2604 dev = serial->dev; 2605 2606 dbg("%s\n", "Entering..."); 2607 2608 /* we set up the pointers to the endpoints in the mos7840_open * 2609 * function, as the structures aren't created yet. */ 2610 2611 /* set up port private structures */ 2612 for (i = 0; i < serial->num_ports; ++i) { 2613 mos7840_port = kmalloc(sizeof(struct moschip_port), GFP_KERNEL); 2614 if (mos7840_port == NULL) { 2615 err("%s - Out of memory", __FUNCTION__); 2616 return -ENOMEM; 2617 } 2618 memset(mos7840_port, 0, sizeof(struct moschip_port)); 2619 2620 /* Initialize all port interrupt end point to port 0 int endpoint * 2621 * Our device has only one interrupt end point comman to all port */ 2622 2623 mos7840_port->port = serial->port[i]; 2624 mos7840_set_port_private(serial->port[i], mos7840_port); 2625 2626 mos7840_port->port_num = ((serial->port[i]->number - 2627 (serial->port[i]->serial->minor)) + 2628 1); 2629 2630 if (mos7840_port->port_num == 1) { 2631 mos7840_port->SpRegOffset = 0x0; 2632 mos7840_port->ControlRegOffset = 0x1; 2633 mos7840_port->DcrRegOffset = 0x4; 2634 } else if ((mos7840_port->port_num == 2) 2635 && (mos7840_num_ports == 4)) { 2636 mos7840_port->SpRegOffset = 0x8; 2637 mos7840_port->ControlRegOffset = 0x9; 2638 mos7840_port->DcrRegOffset = 0x16; 2639 } else if ((mos7840_port->port_num == 2) 2640 && (mos7840_num_ports == 2)) { 2641 mos7840_port->SpRegOffset = 0xa; 2642 mos7840_port->ControlRegOffset = 0xb; 2643 mos7840_port->DcrRegOffset = 0x19; 2644 } else if ((mos7840_port->port_num == 3) 2645 && (mos7840_num_ports == 4)) { 2646 mos7840_port->SpRegOffset = 0xa; 2647 mos7840_port->ControlRegOffset = 0xb; 2648 mos7840_port->DcrRegOffset = 0x19; 2649 } else if ((mos7840_port->port_num == 4) 2650 && (mos7840_num_ports == 4)) { 2651 mos7840_port->SpRegOffset = 0xc; 2652 mos7840_port->ControlRegOffset = 0xd; 2653 mos7840_port->DcrRegOffset = 0x1c; 2654 } 2655 mos7840_dump_serial_port(mos7840_port); 2656 2657 mos7840_set_port_private(serial->port[i], mos7840_port); 2658 2659 //enable rx_disable bit in control register 2660 2661 status = 2662 mos7840_get_reg_sync(serial->port[i], 2663 mos7840_port->ControlRegOffset, &Data); 2664 if (status < 0) { 2665 dbg("Reading ControlReg failed status-0x%x\n", status); 2666 break; 2667 } else 2668 dbg("ControlReg Reading success val is %x, status%d\n", 2669 Data, status); 2670 Data |= 0x08; //setting driver done bit 2671 Data |= 0x04; //sp1_bit to have cts change reflect in modem status reg 2672 2673 //Data |= 0x20; //rx_disable bit 2674 status = 0; 2675 status = 2676 mos7840_set_reg_sync(serial->port[i], 2677 mos7840_port->ControlRegOffset, Data); 2678 if (status < 0) { 2679 dbg("Writing ControlReg failed(rx_disable) status-0x%x\n", status); 2680 break; 2681 } else 2682 dbg("ControlReg Writing success(rx_disable) status%d\n", 2683 status); 2684 2685 //Write default values in DCR (i.e 0x01 in DCR0, 0x05 in DCR2 and 0x24 in DCR3 2686 Data = 0x01; 2687 status = 0; 2688 status = 2689 mos7840_set_reg_sync(serial->port[i], 2690 (__u16) (mos7840_port->DcrRegOffset + 2691 0), Data); 2692 if (status < 0) { 2693 dbg("Writing DCR0 failed status-0x%x\n", status); 2694 break; 2695 } else 2696 dbg("DCR0 Writing success status%d\n", status); 2697 2698 Data = 0x05; 2699 status = 0; 2700 status = 2701 mos7840_set_reg_sync(serial->port[i], 2702 (__u16) (mos7840_port->DcrRegOffset + 2703 1), Data); 2704 if (status < 0) { 2705 dbg("Writing DCR1 failed status-0x%x\n", status); 2706 break; 2707 } else 2708 dbg("DCR1 Writing success status%d\n", status); 2709 2710 Data = 0x24; 2711 status = 0; 2712 status = 2713 mos7840_set_reg_sync(serial->port[i], 2714 (__u16) (mos7840_port->DcrRegOffset + 2715 2), Data); 2716 if (status < 0) { 2717 dbg("Writing DCR2 failed status-0x%x\n", status); 2718 break; 2719 } else 2720 dbg("DCR2 Writing success status%d\n", status); 2721 2722 // write values in clkstart0x0 and clkmulti 0x20 2723 Data = 0x0; 2724 status = 0; 2725 status = 2726 mos7840_set_reg_sync(serial->port[i], 2727 CLK_START_VALUE_REGISTER, Data); 2728 if (status < 0) { 2729 dbg("Writing CLK_START_VALUE_REGISTER failed status-0x%x\n", status); 2730 break; 2731 } else 2732 dbg("CLK_START_VALUE_REGISTER Writing success status%d\n", status); 2733 2734 Data = 0x20; 2735 status = 0; 2736 status = 2737 mos7840_set_reg_sync(serial->port[i], CLK_MULTI_REGISTER, 2738 Data); 2739 if (status < 0) { 2740 dbg("Writing CLK_MULTI_REGISTER failed status-0x%x\n", 2741 status); 2742 break; 2743 } else 2744 dbg("CLK_MULTI_REGISTER Writing success status%d\n", 2745 status); 2746 2747 //write value 0x0 to scratchpad register 2748 Data = 0x00; 2749 status = 0; 2750 status = 2751 mos7840_set_uart_reg(serial->port[i], SCRATCH_PAD_REGISTER, 2752 Data); 2753 if (status < 0) { 2754 dbg("Writing SCRATCH_PAD_REGISTER failed status-0x%x\n", 2755 status); 2756 break; 2757 } else 2758 dbg("SCRATCH_PAD_REGISTER Writing success status%d\n", 2759 status); 2760 2761 //Zero Length flag register 2762 if ((mos7840_port->port_num != 1) 2763 && (mos7840_num_ports == 2)) { 2764 2765 Data = 0xff; 2766 status = 0; 2767 status = mos7840_set_reg_sync(serial->port[i], 2768 (__u16) (ZLP_REG1 + 2769 ((__u16) 2770 mos7840_port-> 2771 port_num)), 2772 Data); 2773 dbg("ZLIP offset%x\n", 2774 (__u16) (ZLP_REG1 + 2775 ((__u16) mos7840_port->port_num))); 2776 if (status < 0) { 2777 dbg("Writing ZLP_REG%d failed status-0x%x\n", 2778 i + 2, status); 2779 break; 2780 } else 2781 dbg("ZLP_REG%d Writing success status%d\n", 2782 i + 2, status); 2783 } else { 2784 Data = 0xff; 2785 status = 0; 2786 status = mos7840_set_reg_sync(serial->port[i], 2787 (__u16) (ZLP_REG1 + 2788 ((__u16) 2789 mos7840_port-> 2790 port_num) - 2791 0x1), Data); 2792 dbg("ZLIP offset%x\n", 2793 (__u16) (ZLP_REG1 + 2794 ((__u16) mos7840_port->port_num) - 0x1)); 2795 if (status < 0) { 2796 dbg("Writing ZLP_REG%d failed status-0x%x\n", 2797 i + 1, status); 2798 break; 2799 } else 2800 dbg("ZLP_REG%d Writing success status%d\n", 2801 i + 1, status); 2802 2803 } 2804 mos7840_port->control_urb = usb_alloc_urb(0, SLAB_ATOMIC); 2805 mos7840_port->ctrl_buf = kmalloc(16, GFP_KERNEL); 2806 2807 } 2808 2809 //Zero Length flag enable 2810 Data = 0x0f; 2811 status = 0; 2812 status = mos7840_set_reg_sync(serial->port[0], ZLP_REG5, Data); 2813 if (status < 0) { 2814 dbg("Writing ZLP_REG5 failed status-0x%x\n", status); 2815 return -1; 2816 } else 2817 dbg("ZLP_REG5 Writing success status%d\n", status); 2818 2819 /* setting configuration feature to one */ 2820 usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 2821 (__u8) 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 5 * HZ); 2822 return 0; 2823} 2824 2825/**************************************************************************** 2826 * mos7840_shutdown 2827 * This function is called whenever the device is removed from the usb bus. 2828 ****************************************************************************/ 2829 2830static void mos7840_shutdown(struct usb_serial *serial) 2831{ 2832 int i; 2833 struct moschip_port *mos7840_port; 2834 dbg("%s \n", " shutdown :entering.........."); 2835 2836 if (!serial) { 2837 dbg("%s", "Invalid Handler \n"); 2838 return; 2839 } 2840 2841 /* check for the ports to be closed,close the ports and disconnect */ 2842 2843 /* free private structure allocated for serial port * 2844 * stop reads and writes on all ports */ 2845 2846 for (i = 0; i < serial->num_ports; ++i) { 2847 mos7840_port = mos7840_get_port_private(serial->port[i]); 2848 kfree(mos7840_port->ctrl_buf); 2849 usb_kill_urb(mos7840_port->control_urb); 2850 kfree(mos7840_port); 2851 mos7840_set_port_private(serial->port[i], NULL); 2852 } 2853 2854 dbg("%s\n", "Thank u :: "); 2855 2856} 2857 2858static struct usb_serial_driver moschip7840_4port_device = { 2859 .driver = { 2860 .owner = THIS_MODULE, 2861 .name = "mos7840", 2862 }, 2863 .description = DRIVER_DESC, 2864 .id_table = moschip_port_id_table, 2865 .num_interrupt_in = 1, //NUM_DONT_CARE,//1, 2866#ifdef check 2867 .num_bulk_in = 4, 2868 .num_bulk_out = 4, 2869 .num_ports = 4, 2870#endif 2871 .open = mos7840_open, 2872 .close = mos7840_close, 2873 .write = mos7840_write, 2874 .write_room = mos7840_write_room, 2875 .chars_in_buffer = mos7840_chars_in_buffer, 2876 .throttle = mos7840_throttle, 2877 .unthrottle = mos7840_unthrottle, 2878 .calc_num_ports = mos7840_calc_num_ports, 2879#ifdef MCSSerialProbe 2880 .probe = mos7840_serial_probe, 2881#endif 2882 .ioctl = mos7840_ioctl, 2883 .set_termios = mos7840_set_termios, 2884 .break_ctl = mos7840_break, 2885 .tiocmget = mos7840_tiocmget, 2886 .tiocmset = mos7840_tiocmset, 2887 .attach = mos7840_startup, 2888 .shutdown = mos7840_shutdown, 2889 .read_bulk_callback = mos7840_bulk_in_callback, 2890 .read_int_callback = mos7840_interrupt_callback, 2891}; 2892 2893static struct usb_driver io_driver = { 2894 .name = "mos7840", 2895 .probe = usb_serial_probe, 2896 .disconnect = usb_serial_disconnect, 2897 .id_table = moschip_id_table_combined, 2898}; 2899 2900/**************************************************************************** 2901 * moschip7840_init 2902 * This is called by the module subsystem, or on startup to initialize us 2903 ****************************************************************************/ 2904static int __init moschip7840_init(void) 2905{ 2906 int retval; 2907 2908 dbg("%s \n", " mos7840_init :entering.........."); 2909 2910 /* Register with the usb serial */ 2911 retval = usb_serial_register(&moschip7840_4port_device); 2912 2913 if (retval) 2914 goto failed_port_device_register; 2915 2916 dbg("%s\n", "Entring..."); 2917 info(DRIVER_DESC " " DRIVER_VERSION); 2918 2919 /* Register with the usb */ 2920 retval = usb_register(&io_driver); 2921 2922 if (retval) 2923 goto failed_usb_register; 2924 2925 if (retval == 0) { 2926 dbg("%s\n", "Leaving..."); 2927 return 0; 2928 } 2929 2930 failed_usb_register: 2931 usb_serial_deregister(&moschip7840_4port_device); 2932 2933 failed_port_device_register: 2934 2935 return retval; 2936} 2937 2938/**************************************************************************** 2939 * moschip7840_exit 2940 * Called when the driver is about to be unloaded. 2941 ****************************************************************************/ 2942static void __exit moschip7840_exit(void) 2943{ 2944 2945 dbg("%s \n", " mos7840_exit :entering.........."); 2946 2947 usb_deregister(&io_driver); 2948 2949 usb_serial_deregister(&moschip7840_4port_device); 2950 2951 dbg("%s\n", "Entring..."); 2952} 2953 2954module_init(moschip7840_init); 2955module_exit(moschip7840_exit); 2956 2957/* Module information */ 2958MODULE_DESCRIPTION(DRIVER_DESC); 2959MODULE_LICENSE("GPL"); 2960 2961module_param(debug, bool, S_IRUGO | S_IWUSR); 2962MODULE_PARM_DESC(debug, "Debug enabled or not");