Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 pppd и usb   Zahar Kiselev   17 Sep 2005 15:06:04 
 Re: pppd и usb   Vitaly Mayatskih   17 Sep 2005 19:35:10 
 Re: pppd и usb   Zahar Kiselev   20 Sep 2005 00:51:02 
 Re: pppd и usb   Vitaly Mayatskih   20 Sep 2005 12:43:46 
 Re: pppd и usb   Zahar Kiselev   20 Sep 2005 17:24:26 
 Re: pppd и usb   Eugeny Chernetcki   21 Sep 2005 02:18:22 
 Re: pppd и usb   Kirill Frolov   22 Sep 2005 00:47:41 
 Re: pppd и usb   Eugeny Chernetcki   22 Sep 2005 03:57:28 
 Re: pppd и usb   Kirill Frolov   22 Sep 2005 21:47:33 
 Re: pppd и usb   Eugeny Chernetcki   23 Sep 2005 02:34:40 
 Re: pppd и usb   Kirill Frolov   22 Sep 2005 00:46:21 
 Re: pppd и usb   Zahar Kiselev   29 Sep 2005 19:40:04 
 Re: pppd и usb   Zahar Kiselev   29 Sep 2005 19:26:28 
 Re: pppd и usb   Vitaly Mayatskih   30 Sep 2005 00:06:35 
 Re: pppd и usb   Zahar Kiselev   30 Sep 2005 01:05:26 
 Re: pppd и usb   Vitaly Mayatskih   30 Sep 2005 07:14:55 
 Re: pppd и usb   Zahar Kiselev   30 Sep 2005 14:53:50 
 Re: pppd и usb   Eugene B. Berdnikov   30 Sep 2005 17:31:08 
 Re: pppd и usb   Zahar Kiselev   30 Sep 2005 20:55:36 
 Re: pppd и usb   Kirill Frolov   22 Sep 2005 00:45:22 
 Re: pppd и usb   Zahar Kiselev   26 Sep 2005 00:45:30 
 Re: pppd и usb   Zahar Kiselev   30 Sep 2005 01:18:20 
Архивное /ru.linux/3288433c4316.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional