|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Zahar Kiselev 2:5030/382.1 30 Sep 2005 01:05:26 To : Vitaly Mayatskih Subject : Re: pppd и usb -------------------------------------------------------------------------------- Sep 30 00:06 05, Vitaly Mayatskih wrote to Zahar Kiselev: ZK>> Явно что-то где-то с буфером и управлением потоком... ZK>> Причем я послушал работу телефона в эфире - при увеличении длины ZK>> пакета нет именно _передачи_. VM> mtu покрути Это первое что я попробовал. Hо проблему я все-таки победил! Правда убил на это почти мег трафика через gprs(через кабель на ком-порт:) Убил бы больше, но у меня в броузере загрузка картинок хронически отключена:) Оказалось, что надо наложить вот эти два патча. В необходимости второго я не уверен, просто рекомендация из форума. А вот первый похоже как раз включает принудительное использование управления потоком посредством RTS/CTS, без которого имеем неправильную работу с буферами данных либо в микросхеме, либо в самом телефоне. От того короткие пакеты(которые успевают) проходят, а более длинные уже нет так как буферизация не работает. Увы - описания вот этих VENDOR_WRITE_REQUEST_TYPE я так и не нашел в виде самостоятельного документа. Теперь меня не удивляет, что народ на форумах того же "сименс-клуба" столько возится с подбором работающих кабелей. Тут действительно и паяльник оказался нужен и программирование.... Заодно насколько я понял патч к драйверу PL2303 добавляет правильное распознавание более новых версий этой микросхемы, которые имеют дополнительную букву в обозначении. Они как минимум размером буферов отличаются судя по pdf-описаниям. ----- pl2303x.patch begins ----- --- drivers/usb/serial/pl2303.c.orig 2004-12-10 18:11:33.000000000 +0200 +++ drivers/usb/serial/pl2303.c 2005-01-08 19:10:42.292795960 +0200 @@ -176,6 +176,7 @@ struct pl2303_private { u8 line_control; u8 line_status; u8 termios_initialized; + u8 driverType; }; @@ -393,10 +394,21 @@ static void pl2303_set_termios (struct u buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]); if (cflag & CRTSCTS) { - i = usb_control_msg (serial->dev, usb_sndctrlpipe (serial->dev, 0), - VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE, - 0x0, 0x41, NULL, 0, 100); - dbg ("0x40:0x1:0x0:0x41 %d", i); + if (priv->driverType == 2) { + i = usb_control_msg (serial->dev, + usb_sndctrlpipe (serial->dev, 0), + VENDOR_WRITE_REQUEST, + VENDOR_WRITE_REQUEST_TYPE, + 0x0, 0x61, NULL, 0, 100); + dbg ("0x40:0x1:0x0:0x61 %d", i); + } else { + i = usb_control_msg (serial->dev, + usb_sndctrlpipe (serial->dev, 0), + VENDOR_WRITE_REQUEST, + VENDOR_WRITE_REQUEST_TYPE, + 0x0, 0x41, NULL, 0, 100); + dbg ("0x40:0x1:0x0:0x41 %d", i); + } } kfree (buf); @@ -409,12 +421,28 @@ static int pl2303_open (struct usb_seria struct usb_serial *serial = port->serial; unsigned char *buf; int result; + struct pl2303_private *priv = usb_get_serial_port_data(port);; if (port_paranoia_check (port, __FUNCTION__)) return -ENODEV; dbg("%s - port %d", __FUNCTION__, port->number); + if (serial->dev->descriptor.bDeviceClass == 0x02) + priv->driverType = 0; + else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40) + priv->driverType = 2; + else if (serial->dev->descriptor.bDeviceClass == 0x00) + priv->driverType = 1; + else if (serial->dev->descriptor.bDeviceClass == 0xFF) + priv->driverType = 1; + + printk("PL-2303 driver type: "); + if (priv->driverType != 2) + printk("old (PL-2303).\n"); + else + printk("new (PL-2303X).\n"); + usb_clear_halt(serial->dev, port->write_urb->pipe); usb_clear_halt(serial->dev, port->read_urb->pipe); @@ -440,6 +468,15 @@ static int pl2303_open (struct usb_seria SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 1); FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0); FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0); + SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0, 1); + SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 1, 0); + if (priv->driverType == 2) { + SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, + 2, 0x44); + } else { + SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, + 2, 0x24); + } kfree(buf); ----- pl2303x.patch ends ----- ----- usb_ser.patch begins ----- --- 1.31/drivers/usb/serial/usbserial.c 2004-06-22 10:51:57 +09:00 +++ 1.32/drivers/usb/serial/usbserial.c 2004-11-01 23:29:07 +09:00 @@ -508,8 +508,18 @@ static void post_helper(void *arg) down(&port->sem); dbg("%s - port %d len %d backlog %d", __FUNCTION__, port->number, job->len, port->write_backlog); - if (port->tty != NULL) - __serial_write(port, 0, job->buff, job->len); + if (port->tty != NULL) { + int rc; + int sent = 0; + while (sent < job->len) { + rc = __serial_write(port, 0, job->buff + sent, job->len - sent); + if ((rc < 0) || signal_pending(current)) + break; + sent += rc; + if ((sent < job->len) && current->need_resched) + schedule(); + } + } up(&port->sem); spin_lock_irqsave(&post_lock, flags); ----- usb_ser.patch ends ----- Zahar --- Msged/LNX 6.1.1 * Origin: FIDO over GPRS (2:5030/382.1) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/3288433c4316.html, оценка из 5, голосов 10
|