0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #include <linux/kernel.h>
0014 #include <linux/errno.h>
0015 #include <linux/slab.h>
0016 #include <linux/timer.h>
0017 #include <linux/tty.h>
0018 #include <linux/tty_driver.h>
0019 #include <linux/tty_flip.h>
0020 #include <linux/module.h>
0021 #include <linux/spinlock.h>
0022 #include <linux/uaccess.h>
0023 #include <linux/atomic.h>
0024 #include <linux/usb.h>
0025 #include <linux/usb/serial.h>
0026
0027
0028 static int initial_mode = 1;
0029
0030 #define GARMIN_VENDOR_ID 0x091E
0031
0032
0033
0034
0035
0036 #define VERSION_MAJOR 0
0037 #define VERSION_MINOR 36
0038
0039 #define _STR(s) #s
0040 #define _DRIVER_VERSION(a, b) "v" _STR(a) "." _STR(b)
0041 #define DRIVER_VERSION _DRIVER_VERSION(VERSION_MAJOR, VERSION_MINOR)
0042 #define DRIVER_AUTHOR "hermann kneissel"
0043 #define DRIVER_DESC "garmin gps driver"
0044
0045
0046 #define EINVPKT 1000
0047
0048
0049
0050 #define GARMIN_PKTHDR_LENGTH 12
0051
0052
0053 #define MAX_SERIAL_PKT_SIZ (3 + 255 + 3)
0054
0055
0056 #define MAX_SERIAL_PKT_SIZ_STUFFED (MAX_SERIAL_PKT_SIZ + 256)
0057
0058
0059
0060
0061
0062
0063
0064 #define GPS_IN_BUFSIZ (GARMIN_PKTHDR_LENGTH+MAX_SERIAL_PKT_SIZ)
0065
0066
0067 #define GPS_OUT_BUFSIZ (GARMIN_PKTHDR_LENGTH+MAX_SERIAL_PKT_SIZ_STUFFED)
0068
0069
0070
0071
0072 #define GSP_INITIAL_OFFSET (GARMIN_PKTHDR_LENGTH-2)
0073
0074
0075 #define PRIVPKTSIZ (GARMIN_PKTHDR_LENGTH+4)
0076
0077 #define GARMIN_LAYERID_TRANSPORT 0
0078 #define GARMIN_LAYERID_APPL 20
0079
0080 #define GARMIN_LAYERID_PRIVATE 0x01106E4B
0081
0082 #define GARMIN_PKTID_PVT_DATA 51
0083 #define GARMIN_PKTID_L001_COMMAND_DATA 10
0084
0085 #define CMND_ABORT_TRANSFER 0
0086
0087
0088 #define PRIV_PKTID_SET_DEBUG 1
0089 #define PRIV_PKTID_SET_MODE 2
0090 #define PRIV_PKTID_INFO_REQ 3
0091 #define PRIV_PKTID_INFO_RESP 4
0092 #define PRIV_PKTID_RESET_REQ 5
0093 #define PRIV_PKTID_SET_DEF_MODE 6
0094
0095
0096 #define ETX 0x03
0097 #define DLE 0x10
0098 #define ACK 0x06
0099 #define NAK 0x15
0100
0101
0102 struct garmin_packet {
0103 struct list_head list;
0104 int seq;
0105
0106 int size;
0107 __u8 data[];
0108 };
0109
0110
0111 struct garmin_data {
0112 __u8 state;
0113 __u16 flags;
0114 __u8 mode;
0115 __u8 count;
0116 __u8 pkt_id;
0117 __u32 serial_num;
0118 struct timer_list timer;
0119 struct usb_serial_port *port;
0120 int seq_counter;
0121 int insize;
0122 int outsize;
0123 __u8 inbuffer [GPS_IN_BUFSIZ];
0124 __u8 outbuffer[GPS_OUT_BUFSIZ];
0125 __u8 privpkt[4*6];
0126 spinlock_t lock;
0127 struct list_head pktlist;
0128 struct usb_anchor write_urbs;
0129 };
0130
0131
0132 #define STATE_NEW 0
0133 #define STATE_INITIAL_DELAY 1
0134 #define STATE_TIMEOUT 2
0135 #define STATE_SESSION_REQ1 3
0136 #define STATE_SESSION_REQ2 4
0137 #define STATE_ACTIVE 5
0138
0139 #define STATE_RESET 8
0140 #define STATE_DISCONNECTED 9
0141 #define STATE_WAIT_TTY_ACK 10
0142 #define STATE_GSP_WAIT_DATA 11
0143
0144 #define MODE_NATIVE 0
0145 #define MODE_GARMIN_SERIAL 1
0146
0147
0148 #define FLAGS_SESSION_REPLY_MASK 0x00C0
0149 #define FLAGS_SESSION_REPLY1_SEEN 0x0080
0150 #define FLAGS_SESSION_REPLY2_SEEN 0x0040
0151 #define FLAGS_BULK_IN_ACTIVE 0x0020
0152 #define FLAGS_BULK_IN_RESTART 0x0010
0153 #define FLAGS_THROTTLED 0x0008
0154 #define APP_REQ_SEEN 0x0004
0155 #define APP_RESP_SEEN 0x0002
0156 #define CLEAR_HALT_REQUIRED 0x0001
0157
0158 #define FLAGS_QUEUING 0x0100
0159 #define FLAGS_DROP_DATA 0x0800
0160
0161 #define FLAGS_GSP_SKIP 0x1000
0162 #define FLAGS_GSP_DLESEEN 0x2000
0163
0164
0165
0166
0167
0168
0169
0170 static int gsp_next_packet(struct garmin_data *garmin_data_p);
0171 static int garmin_write_bulk(struct usb_serial_port *port,
0172 const unsigned char *buf, int count,
0173 int dismiss_ack);
0174
0175
0176 static unsigned char const GARMIN_START_SESSION_REQ[]
0177 = { 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0 };
0178 static unsigned char const GARMIN_START_SESSION_REPLY[]
0179 = { 0, 0, 0, 0, 6, 0, 0, 0, 4, 0, 0, 0 };
0180 static unsigned char const GARMIN_BULK_IN_AVAIL_REPLY[]
0181 = { 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 };
0182 static unsigned char const GARMIN_STOP_TRANSFER_REQ[]
0183 = { 20, 0, 0, 0, 10, 0, 0, 0, 2, 0, 0, 0, 0, 0 };
0184 static unsigned char const GARMIN_STOP_TRANSFER_REQ_V2[]
0185 = { 20, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 0 };
0186
0187
0188 #if 0
0189 static unsigned char const GARMIN_APP_LAYER_REPLY[]
0190 = { 0x14, 0, 0, 0 };
0191 static unsigned char const GARMIN_START_PVT_REQ[]
0192 = { 20, 0, 0, 0, 10, 0, 0, 0, 2, 0, 0, 0, 49, 0 };
0193 static unsigned char const GARMIN_STOP_PVT_REQ[]
0194 = { 20, 0, 0, 0, 10, 0, 0, 0, 2, 0, 0, 0, 50, 0 };
0195 static unsigned char const PRIVATE_REQ[]
0196 = { 0x4B, 0x6E, 0x10, 0x01, 0xFF, 0, 0, 0, 0xFF, 0, 0, 0 };
0197 #endif
0198
0199
0200 static const struct usb_device_id id_table[] = {
0201
0202
0203 { USB_DEVICE(GARMIN_VENDOR_ID, 3) },
0204 { }
0205 };
0206 MODULE_DEVICE_TABLE(usb, id_table);
0207
0208
0209 static inline int getLayerId(const __u8 *usbPacket)
0210 {
0211 return __le32_to_cpup((__le32 *)(usbPacket));
0212 }
0213
0214 static inline int getPacketId(const __u8 *usbPacket)
0215 {
0216 return __le32_to_cpup((__le32 *)(usbPacket+4));
0217 }
0218
0219 static inline int getDataLength(const __u8 *usbPacket)
0220 {
0221 return __le32_to_cpup((__le32 *)(usbPacket+8));
0222 }
0223
0224
0225
0226
0227
0228
0229 static inline int isAbortTrfCmnd(const unsigned char *buf)
0230 {
0231 if (memcmp(buf, GARMIN_STOP_TRANSFER_REQ,
0232 sizeof(GARMIN_STOP_TRANSFER_REQ)) == 0 ||
0233 memcmp(buf, GARMIN_STOP_TRANSFER_REQ_V2,
0234 sizeof(GARMIN_STOP_TRANSFER_REQ_V2)) == 0)
0235 return 1;
0236 else
0237 return 0;
0238 }
0239
0240
0241
0242 static void send_to_tty(struct usb_serial_port *port,
0243 char *data, unsigned int actual_length)
0244 {
0245 if (actual_length) {
0246 usb_serial_debug_data(&port->dev, __func__, actual_length, data);
0247 tty_insert_flip_string(&port->port, data, actual_length);
0248 tty_flip_buffer_push(&port->port);
0249 }
0250 }
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260 static int pkt_add(struct garmin_data *garmin_data_p,
0261 unsigned char *data, unsigned int data_length)
0262 {
0263 int state = 0;
0264 int result = 0;
0265 unsigned long flags;
0266 struct garmin_packet *pkt;
0267
0268
0269 if (data_length) {
0270 pkt = kmalloc(sizeof(struct garmin_packet)+data_length,
0271 GFP_ATOMIC);
0272 if (!pkt)
0273 return 0;
0274
0275 pkt->size = data_length;
0276 memcpy(pkt->data, data, data_length);
0277
0278 spin_lock_irqsave(&garmin_data_p->lock, flags);
0279 garmin_data_p->flags |= FLAGS_QUEUING;
0280 result = list_empty(&garmin_data_p->pktlist);
0281 pkt->seq = garmin_data_p->seq_counter++;
0282 list_add_tail(&pkt->list, &garmin_data_p->pktlist);
0283 state = garmin_data_p->state;
0284 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
0285
0286 dev_dbg(&garmin_data_p->port->dev,
0287 "%s - added: pkt: %d - %d bytes\n", __func__,
0288 pkt->seq, data_length);
0289
0290
0291
0292 if (result && (state == STATE_GSP_WAIT_DATA))
0293 gsp_next_packet(garmin_data_p);
0294 }
0295 return result;
0296 }
0297
0298
0299
0300 static struct garmin_packet *pkt_pop(struct garmin_data *garmin_data_p)
0301 {
0302 unsigned long flags;
0303 struct garmin_packet *result = NULL;
0304
0305 spin_lock_irqsave(&garmin_data_p->lock, flags);
0306 if (!list_empty(&garmin_data_p->pktlist)) {
0307 result = (struct garmin_packet *)garmin_data_p->pktlist.next;
0308 list_del(&result->list);
0309 }
0310 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
0311 return result;
0312 }
0313
0314
0315
0316 static void pkt_clear(struct garmin_data *garmin_data_p)
0317 {
0318 unsigned long flags;
0319 struct garmin_packet *result = NULL;
0320
0321 spin_lock_irqsave(&garmin_data_p->lock, flags);
0322 while (!list_empty(&garmin_data_p->pktlist)) {
0323 result = (struct garmin_packet *)garmin_data_p->pktlist.next;
0324 list_del(&result->list);
0325 kfree(result);
0326 }
0327 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
0328 }
0329
0330
0331
0332
0333
0334
0335
0336 static int gsp_send_ack(struct garmin_data *garmin_data_p, __u8 pkt_id)
0337 {
0338 __u8 pkt[10];
0339 __u8 cksum = 0;
0340 __u8 *ptr = pkt;
0341 unsigned l = 0;
0342
0343 dev_dbg(&garmin_data_p->port->dev, "%s - pkt-id: 0x%X.\n", __func__,
0344 pkt_id);
0345
0346 *ptr++ = DLE;
0347 *ptr++ = ACK;
0348 cksum += ACK;
0349
0350 *ptr++ = 2;
0351 cksum += 2;
0352
0353 *ptr++ = pkt_id;
0354 cksum += pkt_id;
0355
0356 if (pkt_id == DLE)
0357 *ptr++ = DLE;
0358
0359 *ptr++ = 0;
0360 *ptr++ = (-cksum) & 0xFF;
0361 *ptr++ = DLE;
0362 *ptr++ = ETX;
0363
0364 l = ptr-pkt;
0365
0366 send_to_tty(garmin_data_p->port, pkt, l);
0367 return 0;
0368 }
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382 static int gsp_rec_packet(struct garmin_data *garmin_data_p, int count)
0383 {
0384 struct device *dev = &garmin_data_p->port->dev;
0385 unsigned long flags;
0386 const __u8 *recpkt = garmin_data_p->inbuffer+GSP_INITIAL_OFFSET;
0387 __le32 *usbdata = (__le32 *) garmin_data_p->inbuffer;
0388 int cksum = 0;
0389 int n = 0;
0390 int pktid = recpkt[0];
0391 int size = recpkt[1];
0392
0393 usb_serial_debug_data(&garmin_data_p->port->dev, __func__,
0394 count-GSP_INITIAL_OFFSET, recpkt);
0395
0396 if (size != (count-GSP_INITIAL_OFFSET-3)) {
0397 dev_dbg(dev, "%s - invalid size, expected %d bytes, got %d\n",
0398 __func__, size, (count-GSP_INITIAL_OFFSET-3));
0399 return -EINVPKT;
0400 }
0401
0402 cksum += *recpkt++;
0403 cksum += *recpkt++;
0404
0405
0406 if ((__u8 *)&(usbdata[3]) != recpkt) {
0407 dev_dbg(dev, "%s - ptr mismatch %p - %p\n", __func__,
0408 &(usbdata[4]), recpkt);
0409 return -EINVPKT;
0410 }
0411
0412 while (n < size) {
0413 cksum += *recpkt++;
0414 n++;
0415 }
0416
0417 if (((cksum + *recpkt) & 0xff) != 0) {
0418 dev_dbg(dev, "%s - invalid checksum, expected %02x, got %02x\n",
0419 __func__, -cksum & 0xff, *recpkt);
0420 return -EINVPKT;
0421 }
0422
0423 usbdata[0] = __cpu_to_le32(GARMIN_LAYERID_APPL);
0424 usbdata[1] = __cpu_to_le32(pktid);
0425 usbdata[2] = __cpu_to_le32(size);
0426
0427 garmin_write_bulk(garmin_data_p->port, garmin_data_p->inbuffer,
0428 GARMIN_PKTHDR_LENGTH+size, 0);
0429
0430
0431
0432 if (isAbortTrfCmnd(garmin_data_p->inbuffer)) {
0433 spin_lock_irqsave(&garmin_data_p->lock, flags);
0434 garmin_data_p->flags |= FLAGS_DROP_DATA;
0435 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
0436 pkt_clear(garmin_data_p);
0437 }
0438
0439 return count;
0440 }
0441
0442
0443
0444
0445
0446
0447
0448
0449
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460
0461
0462 static int gsp_receive(struct garmin_data *garmin_data_p,
0463 const unsigned char *buf, int count)
0464 {
0465 struct device *dev = &garmin_data_p->port->dev;
0466 unsigned long flags;
0467 int offs = 0;
0468 int ack_or_nak_seen = 0;
0469 __u8 *dest;
0470 int size;
0471
0472 int dleSeen;
0473
0474
0475
0476 int skip;
0477 __u8 data;
0478
0479 spin_lock_irqsave(&garmin_data_p->lock, flags);
0480 dest = garmin_data_p->inbuffer;
0481 size = garmin_data_p->insize;
0482 dleSeen = garmin_data_p->flags & FLAGS_GSP_DLESEEN;
0483 skip = garmin_data_p->flags & FLAGS_GSP_SKIP;
0484 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
0485
0486
0487
0488
0489 if (size == 0)
0490 size = GSP_INITIAL_OFFSET;
0491
0492 while (offs < count) {
0493
0494 data = *(buf+offs);
0495 offs++;
0496
0497 if (data == DLE) {
0498 if (skip) {
0499 skip = 0;
0500 size = GSP_INITIAL_OFFSET;
0501 dleSeen = 1;
0502 } else if (dleSeen) {
0503 dest[size++] = data;
0504 dleSeen = 0;
0505 } else {
0506 dleSeen = 1;
0507 }
0508 } else if (data == ETX) {
0509 if (dleSeen) {
0510
0511
0512 data = dest[GSP_INITIAL_OFFSET];
0513
0514 if (data == ACK) {
0515 ack_or_nak_seen = ACK;
0516 dev_dbg(dev, "ACK packet complete.\n");
0517 } else if (data == NAK) {
0518 ack_or_nak_seen = NAK;
0519 dev_dbg(dev, "NAK packet complete.\n");
0520 } else {
0521 dev_dbg(dev, "packet complete - id=0x%X.\n",
0522 data);
0523 gsp_rec_packet(garmin_data_p, size);
0524 }
0525
0526 skip = 1;
0527 size = GSP_INITIAL_OFFSET;
0528 dleSeen = 0;
0529 } else {
0530 dest[size++] = data;
0531 }
0532 } else if (!skip) {
0533
0534 if (dleSeen) {
0535 size = GSP_INITIAL_OFFSET;
0536 dleSeen = 0;
0537 }
0538
0539 dest[size++] = data;
0540 }
0541
0542 if (size >= GPS_IN_BUFSIZ) {
0543 dev_dbg(dev, "%s - packet too large.\n", __func__);
0544 skip = 1;
0545 size = GSP_INITIAL_OFFSET;
0546 dleSeen = 0;
0547 }
0548 }
0549
0550 spin_lock_irqsave(&garmin_data_p->lock, flags);
0551
0552 garmin_data_p->insize = size;
0553
0554
0555 if (skip)
0556 garmin_data_p->flags |= FLAGS_GSP_SKIP;
0557 else
0558 garmin_data_p->flags &= ~FLAGS_GSP_SKIP;
0559
0560 if (dleSeen)
0561 garmin_data_p->flags |= FLAGS_GSP_DLESEEN;
0562 else
0563 garmin_data_p->flags &= ~FLAGS_GSP_DLESEEN;
0564
0565 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
0566
0567 if (ack_or_nak_seen) {
0568 if (gsp_next_packet(garmin_data_p) > 0)
0569 garmin_data_p->state = STATE_ACTIVE;
0570 else
0571 garmin_data_p->state = STATE_GSP_WAIT_DATA;
0572 }
0573 return count;
0574 }
0575
0576
0577
0578
0579
0580
0581
0582
0583
0584
0585 static int gsp_send(struct garmin_data *garmin_data_p,
0586 const unsigned char *buf, int count)
0587 {
0588 struct device *dev = &garmin_data_p->port->dev;
0589 const unsigned char *src;
0590 unsigned char *dst;
0591 int pktid = 0;
0592 int datalen = 0;
0593 int cksum = 0;
0594 int i = 0;
0595 int k;
0596
0597 dev_dbg(dev, "%s - state %d - %d bytes.\n", __func__,
0598 garmin_data_p->state, count);
0599
0600 k = garmin_data_p->outsize;
0601 if ((k+count) > GPS_OUT_BUFSIZ) {
0602 dev_dbg(dev, "packet too large\n");
0603 garmin_data_p->outsize = 0;
0604 return -4;
0605 }
0606
0607 memcpy(garmin_data_p->outbuffer+k, buf, count);
0608 k += count;
0609 garmin_data_p->outsize = k;
0610
0611 if (k >= GARMIN_PKTHDR_LENGTH) {
0612 pktid = getPacketId(garmin_data_p->outbuffer);
0613 datalen = getDataLength(garmin_data_p->outbuffer);
0614 i = GARMIN_PKTHDR_LENGTH + datalen;
0615 if (k < i)
0616 return 0;
0617 } else {
0618 return 0;
0619 }
0620
0621 dev_dbg(dev, "%s - %d bytes in buffer, %d bytes in pkt.\n", __func__, k, i);
0622
0623
0624
0625 usb_serial_debug_data(&garmin_data_p->port->dev, __func__, k,
0626 garmin_data_p->outbuffer);
0627
0628 garmin_data_p->outsize = 0;
0629
0630 if (getLayerId(garmin_data_p->outbuffer) != GARMIN_LAYERID_APPL) {
0631 dev_dbg(dev, "not an application packet (%d)\n",
0632 getLayerId(garmin_data_p->outbuffer));
0633 return -1;
0634 }
0635
0636 if (pktid > 255) {
0637 dev_dbg(dev, "packet-id %d too large\n", pktid);
0638 return -2;
0639 }
0640
0641 if (datalen > 255) {
0642 dev_dbg(dev, "packet-size %d too large\n", datalen);
0643 return -3;
0644 }
0645
0646
0647
0648 k = 0;
0649 src = garmin_data_p->outbuffer+GARMIN_PKTHDR_LENGTH;
0650 for (i = 0; i < datalen; i++) {
0651 if (*src++ == DLE)
0652 k++;
0653 }
0654
0655 src = garmin_data_p->outbuffer+GARMIN_PKTHDR_LENGTH;
0656 if (k > (GARMIN_PKTHDR_LENGTH-2)) {
0657
0658
0659 dst = garmin_data_p->outbuffer+GPS_OUT_BUFSIZ-datalen;
0660 memcpy(dst, src, datalen);
0661 src = dst;
0662 }
0663
0664 dst = garmin_data_p->outbuffer;
0665
0666 *dst++ = DLE;
0667 *dst++ = pktid;
0668 cksum += pktid;
0669 *dst++ = datalen;
0670 cksum += datalen;
0671 if (datalen == DLE)
0672 *dst++ = DLE;
0673
0674 for (i = 0; i < datalen; i++) {
0675 __u8 c = *src++;
0676 *dst++ = c;
0677 cksum += c;
0678 if (c == DLE)
0679 *dst++ = DLE;
0680 }
0681
0682 cksum = -cksum & 0xFF;
0683 *dst++ = cksum;
0684 if (cksum == DLE)
0685 *dst++ = DLE;
0686 *dst++ = DLE;
0687 *dst++ = ETX;
0688
0689 i = dst-garmin_data_p->outbuffer;
0690
0691 send_to_tty(garmin_data_p->port, garmin_data_p->outbuffer, i);
0692
0693 garmin_data_p->pkt_id = pktid;
0694 garmin_data_p->state = STATE_WAIT_TTY_ACK;
0695
0696 return i;
0697 }
0698
0699
0700
0701
0702
0703 static int gsp_next_packet(struct garmin_data *garmin_data_p)
0704 {
0705 int result = 0;
0706 struct garmin_packet *pkt = NULL;
0707
0708 while ((pkt = pkt_pop(garmin_data_p)) != NULL) {
0709 dev_dbg(&garmin_data_p->port->dev, "%s - next pkt: %d\n", __func__, pkt->seq);
0710 result = gsp_send(garmin_data_p, pkt->data, pkt->size);
0711 if (result > 0) {
0712 kfree(pkt);
0713 return result;
0714 }
0715 kfree(pkt);
0716 }
0717 return result;
0718 }
0719
0720
0721
0722
0723
0724
0725
0726
0727
0728
0729
0730
0731
0732
0733
0734
0735 static int nat_receive(struct garmin_data *garmin_data_p,
0736 const unsigned char *buf, int count)
0737 {
0738 unsigned long flags;
0739 __u8 *dest;
0740 int offs = 0;
0741 int result = count;
0742 int len;
0743
0744 while (offs < count) {
0745
0746 if (garmin_data_p->insize >= GARMIN_PKTHDR_LENGTH)
0747 len = GARMIN_PKTHDR_LENGTH
0748 +getDataLength(garmin_data_p->inbuffer);
0749 else
0750 len = GARMIN_PKTHDR_LENGTH;
0751
0752 if (len >= GPS_IN_BUFSIZ) {
0753
0754
0755 dev_dbg(&garmin_data_p->port->dev,
0756 "%s - packet size too large: %d\n",
0757 __func__, len);
0758 garmin_data_p->insize = 0;
0759 count = 0;
0760 result = -EINVPKT;
0761 } else {
0762 len -= garmin_data_p->insize;
0763 if (len > (count-offs))
0764 len = (count-offs);
0765 if (len > 0) {
0766 dest = garmin_data_p->inbuffer
0767 + garmin_data_p->insize;
0768 memcpy(dest, buf+offs, len);
0769 garmin_data_p->insize += len;
0770 offs += len;
0771 }
0772 }
0773
0774
0775 if (garmin_data_p->insize >= GARMIN_PKTHDR_LENGTH) {
0776 len = GARMIN_PKTHDR_LENGTH+
0777 getDataLength(garmin_data_p->inbuffer);
0778 if (garmin_data_p->insize >= len) {
0779 garmin_write_bulk(garmin_data_p->port,
0780 garmin_data_p->inbuffer,
0781 len, 0);
0782 garmin_data_p->insize = 0;
0783
0784
0785
0786 if (isAbortTrfCmnd(garmin_data_p->inbuffer)) {
0787 spin_lock_irqsave(&garmin_data_p->lock,
0788 flags);
0789 garmin_data_p->flags |= FLAGS_DROP_DATA;
0790 spin_unlock_irqrestore(
0791 &garmin_data_p->lock, flags);
0792 pkt_clear(garmin_data_p);
0793 }
0794 }
0795 }
0796 }
0797 return result;
0798 }
0799
0800
0801
0802
0803
0804
0805 static void priv_status_resp(struct usb_serial_port *port)
0806 {
0807 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
0808 __le32 *pkt = (__le32 *)garmin_data_p->privpkt;
0809
0810 pkt[0] = __cpu_to_le32(GARMIN_LAYERID_PRIVATE);
0811 pkt[1] = __cpu_to_le32(PRIV_PKTID_INFO_RESP);
0812 pkt[2] = __cpu_to_le32(12);
0813 pkt[3] = __cpu_to_le32(VERSION_MAJOR << 16 | VERSION_MINOR);
0814 pkt[4] = __cpu_to_le32(garmin_data_p->mode);
0815 pkt[5] = __cpu_to_le32(garmin_data_p->serial_num);
0816
0817 send_to_tty(port, (__u8 *)pkt, 6 * 4);
0818 }
0819
0820
0821
0822
0823
0824
0825 static int process_resetdev_request(struct usb_serial_port *port)
0826 {
0827 unsigned long flags;
0828 int status;
0829 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
0830
0831 spin_lock_irqsave(&garmin_data_p->lock, flags);
0832 garmin_data_p->flags &= ~(CLEAR_HALT_REQUIRED);
0833 garmin_data_p->state = STATE_RESET;
0834 garmin_data_p->serial_num = 0;
0835 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
0836
0837 usb_kill_urb(port->interrupt_in_urb);
0838 dev_dbg(&port->dev, "%s - usb_reset_device\n", __func__);
0839 status = usb_reset_device(port->serial->dev);
0840 if (status)
0841 dev_dbg(&port->dev, "%s - usb_reset_device failed: %d\n",
0842 __func__, status);
0843 return status;
0844 }
0845
0846
0847
0848
0849
0850
0851 static int garmin_clear(struct garmin_data *garmin_data_p)
0852 {
0853 unsigned long flags;
0854
0855
0856 pkt_clear(garmin_data_p);
0857
0858 spin_lock_irqsave(&garmin_data_p->lock, flags);
0859 garmin_data_p->insize = 0;
0860 garmin_data_p->outsize = 0;
0861 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
0862
0863 return 0;
0864 }
0865
0866
0867 static int garmin_init_session(struct usb_serial_port *port)
0868 {
0869 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
0870 int status;
0871 int i;
0872
0873 usb_kill_urb(port->interrupt_in_urb);
0874
0875 status = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
0876 if (status) {
0877 dev_err(&port->dev, "failed to submit interrupt urb: %d\n",
0878 status);
0879 return status;
0880 }
0881
0882
0883
0884
0885
0886 dev_dbg(&port->dev, "%s - starting session ...\n", __func__);
0887 garmin_data_p->state = STATE_ACTIVE;
0888
0889 for (i = 0; i < 3; i++) {
0890 status = garmin_write_bulk(port, GARMIN_START_SESSION_REQ,
0891 sizeof(GARMIN_START_SESSION_REQ), 0);
0892 if (status < 0)
0893 goto err_kill_urbs;
0894 }
0895
0896 return 0;
0897
0898 err_kill_urbs:
0899 usb_kill_anchored_urbs(&garmin_data_p->write_urbs);
0900 usb_kill_urb(port->interrupt_in_urb);
0901
0902 return status;
0903 }
0904
0905
0906
0907 static int garmin_open(struct tty_struct *tty, struct usb_serial_port *port)
0908 {
0909 unsigned long flags;
0910 int status = 0;
0911 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
0912
0913 spin_lock_irqsave(&garmin_data_p->lock, flags);
0914 garmin_data_p->mode = initial_mode;
0915 garmin_data_p->count = 0;
0916 garmin_data_p->flags &= FLAGS_SESSION_REPLY1_SEEN;
0917 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
0918
0919
0920 usb_kill_urb(port->read_urb);
0921
0922 if (garmin_data_p->state == STATE_RESET)
0923 status = garmin_init_session(port);
0924
0925 garmin_data_p->state = STATE_ACTIVE;
0926 return status;
0927 }
0928
0929
0930 static void garmin_close(struct usb_serial_port *port)
0931 {
0932 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
0933
0934 dev_dbg(&port->dev, "%s - mode=%d state=%d flags=0x%X\n",
0935 __func__, garmin_data_p->mode, garmin_data_p->state,
0936 garmin_data_p->flags);
0937
0938 garmin_clear(garmin_data_p);
0939
0940
0941 usb_kill_urb(port->read_urb);
0942 usb_kill_anchored_urbs(&garmin_data_p->write_urbs);
0943
0944
0945 if (garmin_data_p->state != STATE_RESET)
0946 garmin_data_p->state = STATE_DISCONNECTED;
0947 }
0948
0949
0950 static void garmin_write_bulk_callback(struct urb *urb)
0951 {
0952 struct usb_serial_port *port = urb->context;
0953
0954 if (port) {
0955 struct garmin_data *garmin_data_p =
0956 usb_get_serial_port_data(port);
0957
0958 if (getLayerId(urb->transfer_buffer) == GARMIN_LAYERID_APPL) {
0959
0960 if (garmin_data_p->mode == MODE_GARMIN_SERIAL) {
0961 gsp_send_ack(garmin_data_p,
0962 ((__u8 *)urb->transfer_buffer)[4]);
0963 }
0964 }
0965 usb_serial_port_softint(port);
0966 }
0967
0968
0969
0970
0971
0972 kfree(urb->transfer_buffer);
0973 }
0974
0975
0976 static int garmin_write_bulk(struct usb_serial_port *port,
0977 const unsigned char *buf, int count,
0978 int dismiss_ack)
0979 {
0980 unsigned long flags;
0981 struct usb_serial *serial = port->serial;
0982 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
0983 struct urb *urb;
0984 unsigned char *buffer;
0985 int status;
0986
0987 spin_lock_irqsave(&garmin_data_p->lock, flags);
0988 garmin_data_p->flags &= ~FLAGS_DROP_DATA;
0989 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
0990
0991 buffer = kmemdup(buf, count, GFP_ATOMIC);
0992 if (!buffer)
0993 return -ENOMEM;
0994
0995 urb = usb_alloc_urb(0, GFP_ATOMIC);
0996 if (!urb) {
0997 kfree(buffer);
0998 return -ENOMEM;
0999 }
1000
1001 usb_serial_debug_data(&port->dev, __func__, count, buffer);
1002
1003 usb_fill_bulk_urb(urb, serial->dev,
1004 usb_sndbulkpipe(serial->dev,
1005 port->bulk_out_endpointAddress),
1006 buffer, count,
1007 garmin_write_bulk_callback,
1008 dismiss_ack ? NULL : port);
1009 urb->transfer_flags |= URB_ZERO_PACKET;
1010
1011 if (getLayerId(buffer) == GARMIN_LAYERID_APPL) {
1012
1013 spin_lock_irqsave(&garmin_data_p->lock, flags);
1014 garmin_data_p->flags |= APP_REQ_SEEN;
1015 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
1016
1017 if (garmin_data_p->mode == MODE_GARMIN_SERIAL) {
1018 pkt_clear(garmin_data_p);
1019 garmin_data_p->state = STATE_GSP_WAIT_DATA;
1020 }
1021 }
1022
1023
1024 usb_anchor_urb(urb, &garmin_data_p->write_urbs);
1025 status = usb_submit_urb(urb, GFP_ATOMIC);
1026 if (status) {
1027 dev_err(&port->dev,
1028 "%s - usb_submit_urb(write bulk) failed with status = %d\n",
1029 __func__, status);
1030 count = status;
1031 usb_unanchor_urb(urb);
1032 kfree(buffer);
1033 }
1034
1035
1036
1037 usb_free_urb(urb);
1038
1039 return count;
1040 }
1041
1042 static int garmin_write(struct tty_struct *tty, struct usb_serial_port *port,
1043 const unsigned char *buf, int count)
1044 {
1045 struct device *dev = &port->dev;
1046 int pktid, pktsiz, len;
1047 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1048 __le32 *privpkt = (__le32 *)garmin_data_p->privpkt;
1049
1050 usb_serial_debug_data(dev, __func__, count, buf);
1051
1052 if (garmin_data_p->state == STATE_RESET)
1053 return -EIO;
1054
1055
1056 if (count >= GARMIN_PKTHDR_LENGTH) {
1057 len = PRIVPKTSIZ;
1058 if (count < len)
1059 len = count;
1060
1061 memcpy(garmin_data_p->privpkt, buf, len);
1062
1063 pktsiz = getDataLength(garmin_data_p->privpkt);
1064 pktid = getPacketId(garmin_data_p->privpkt);
1065
1066 if (count == (GARMIN_PKTHDR_LENGTH + pktsiz) &&
1067 getLayerId(garmin_data_p->privpkt) ==
1068 GARMIN_LAYERID_PRIVATE) {
1069
1070 dev_dbg(dev, "%s - processing private request %d\n",
1071 __func__, pktid);
1072
1073
1074 garmin_clear(garmin_data_p);
1075
1076 switch (pktid) {
1077 case PRIV_PKTID_SET_MODE:
1078 if (pktsiz != 4)
1079 return -EINVPKT;
1080 garmin_data_p->mode = __le32_to_cpu(privpkt[3]);
1081 dev_dbg(dev, "%s - mode set to %d\n",
1082 __func__, garmin_data_p->mode);
1083 break;
1084
1085 case PRIV_PKTID_INFO_REQ:
1086 priv_status_resp(port);
1087 break;
1088
1089 case PRIV_PKTID_RESET_REQ:
1090 process_resetdev_request(port);
1091 break;
1092
1093 case PRIV_PKTID_SET_DEF_MODE:
1094 if (pktsiz != 4)
1095 return -EINVPKT;
1096 initial_mode = __le32_to_cpu(privpkt[3]);
1097 dev_dbg(dev, "%s - initial_mode set to %d\n",
1098 __func__,
1099 garmin_data_p->mode);
1100 break;
1101 }
1102 return count;
1103 }
1104 }
1105
1106 if (garmin_data_p->mode == MODE_GARMIN_SERIAL) {
1107 return gsp_receive(garmin_data_p, buf, count);
1108 } else {
1109 return nat_receive(garmin_data_p, buf, count);
1110 }
1111 }
1112
1113
1114 static unsigned int garmin_write_room(struct tty_struct *tty)
1115 {
1116 struct usb_serial_port *port = tty->driver_data;
1117
1118
1119
1120 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1121 return GPS_OUT_BUFSIZ-garmin_data_p->outsize;
1122 }
1123
1124
1125 static void garmin_read_process(struct garmin_data *garmin_data_p,
1126 unsigned char *data, unsigned data_length,
1127 int bulk_data)
1128 {
1129 unsigned long flags;
1130
1131 if (garmin_data_p->flags & FLAGS_DROP_DATA) {
1132
1133 dev_dbg(&garmin_data_p->port->dev, "%s - pkt dropped\n", __func__);
1134 } else if (garmin_data_p->state != STATE_DISCONNECTED &&
1135 garmin_data_p->state != STATE_RESET) {
1136
1137
1138
1139
1140 if (garmin_data_p->flags & FLAGS_QUEUING) {
1141 pkt_add(garmin_data_p, data, data_length);
1142 } else if (bulk_data || (data_length >= sizeof(u32) &&
1143 getLayerId(data) == GARMIN_LAYERID_APPL)) {
1144
1145 spin_lock_irqsave(&garmin_data_p->lock, flags);
1146 garmin_data_p->flags |= APP_RESP_SEEN;
1147 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
1148
1149 if (garmin_data_p->mode == MODE_GARMIN_SERIAL) {
1150 pkt_add(garmin_data_p, data, data_length);
1151 } else {
1152 send_to_tty(garmin_data_p->port, data,
1153 data_length);
1154 }
1155 }
1156
1157 }
1158 }
1159
1160
1161 static void garmin_read_bulk_callback(struct urb *urb)
1162 {
1163 unsigned long flags;
1164 struct usb_serial_port *port = urb->context;
1165 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1166 unsigned char *data = urb->transfer_buffer;
1167 int status = urb->status;
1168 int retval;
1169
1170 if (status) {
1171 dev_dbg(&urb->dev->dev, "%s - nonzero read bulk status received: %d\n",
1172 __func__, status);
1173 return;
1174 }
1175
1176 usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data);
1177
1178 garmin_read_process(garmin_data_p, data, urb->actual_length, 1);
1179
1180 if (urb->actual_length == 0 &&
1181 (garmin_data_p->flags & FLAGS_BULK_IN_RESTART) != 0) {
1182 spin_lock_irqsave(&garmin_data_p->lock, flags);
1183 garmin_data_p->flags &= ~FLAGS_BULK_IN_RESTART;
1184 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
1185 retval = usb_submit_urb(port->read_urb, GFP_ATOMIC);
1186 if (retval)
1187 dev_err(&port->dev,
1188 "%s - failed resubmitting read urb, error %d\n",
1189 __func__, retval);
1190 } else if (urb->actual_length > 0) {
1191
1192 if ((garmin_data_p->flags & FLAGS_THROTTLED) == 0) {
1193 retval = usb_submit_urb(port->read_urb, GFP_ATOMIC);
1194 if (retval)
1195 dev_err(&port->dev,
1196 "%s - failed resubmitting read urb, error %d\n",
1197 __func__, retval);
1198 }
1199 } else {
1200 dev_dbg(&port->dev, "%s - end of bulk data\n", __func__);
1201 spin_lock_irqsave(&garmin_data_p->lock, flags);
1202 garmin_data_p->flags &= ~FLAGS_BULK_IN_ACTIVE;
1203 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
1204 }
1205 }
1206
1207
1208 static void garmin_read_int_callback(struct urb *urb)
1209 {
1210 unsigned long flags;
1211 int retval;
1212 struct usb_serial_port *port = urb->context;
1213 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1214 unsigned char *data = urb->transfer_buffer;
1215 int status = urb->status;
1216
1217 switch (status) {
1218 case 0:
1219
1220 break;
1221 case -ECONNRESET:
1222 case -ENOENT:
1223 case -ESHUTDOWN:
1224
1225 dev_dbg(&urb->dev->dev, "%s - urb shutting down with status: %d\n",
1226 __func__, status);
1227 return;
1228 default:
1229 dev_dbg(&urb->dev->dev, "%s - nonzero urb status received: %d\n",
1230 __func__, status);
1231 return;
1232 }
1233
1234 usb_serial_debug_data(&port->dev, __func__, urb->actual_length,
1235 urb->transfer_buffer);
1236
1237 if (urb->actual_length == sizeof(GARMIN_BULK_IN_AVAIL_REPLY) &&
1238 memcmp(data, GARMIN_BULK_IN_AVAIL_REPLY,
1239 sizeof(GARMIN_BULK_IN_AVAIL_REPLY)) == 0) {
1240
1241 dev_dbg(&port->dev, "%s - bulk data available.\n", __func__);
1242
1243 if ((garmin_data_p->flags & FLAGS_BULK_IN_ACTIVE) == 0) {
1244
1245
1246 retval = usb_submit_urb(port->read_urb, GFP_ATOMIC);
1247 if (retval) {
1248 dev_err(&port->dev,
1249 "%s - failed submitting read urb, error %d\n",
1250 __func__, retval);
1251 } else {
1252 spin_lock_irqsave(&garmin_data_p->lock, flags);
1253 garmin_data_p->flags |= FLAGS_BULK_IN_ACTIVE;
1254 spin_unlock_irqrestore(&garmin_data_p->lock,
1255 flags);
1256 }
1257 } else {
1258
1259 spin_lock_irqsave(&garmin_data_p->lock, flags);
1260 garmin_data_p->flags |= FLAGS_BULK_IN_RESTART;
1261 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
1262 }
1263
1264 } else if (urb->actual_length == (4+sizeof(GARMIN_START_SESSION_REPLY))
1265 && memcmp(data, GARMIN_START_SESSION_REPLY,
1266 sizeof(GARMIN_START_SESSION_REPLY)) == 0) {
1267
1268 spin_lock_irqsave(&garmin_data_p->lock, flags);
1269 garmin_data_p->flags |= FLAGS_SESSION_REPLY1_SEEN;
1270 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
1271
1272
1273 garmin_data_p->serial_num = __le32_to_cpup(
1274 (__le32 *)(data+GARMIN_PKTHDR_LENGTH));
1275
1276 dev_dbg(&port->dev, "%s - start-of-session reply seen - serial %u.\n",
1277 __func__, garmin_data_p->serial_num);
1278 }
1279
1280 garmin_read_process(garmin_data_p, data, urb->actual_length, 0);
1281
1282 retval = usb_submit_urb(urb, GFP_ATOMIC);
1283 if (retval)
1284 dev_err(&urb->dev->dev,
1285 "%s - Error %d submitting interrupt urb\n",
1286 __func__, retval);
1287 }
1288
1289
1290
1291
1292
1293
1294
1295 static int garmin_flush_queue(struct garmin_data *garmin_data_p)
1296 {
1297 unsigned long flags;
1298 struct garmin_packet *pkt;
1299
1300 if ((garmin_data_p->flags & FLAGS_THROTTLED) == 0) {
1301 pkt = pkt_pop(garmin_data_p);
1302 if (pkt != NULL) {
1303 send_to_tty(garmin_data_p->port, pkt->data, pkt->size);
1304 kfree(pkt);
1305 mod_timer(&garmin_data_p->timer, (1)+jiffies);
1306
1307 } else {
1308 spin_lock_irqsave(&garmin_data_p->lock, flags);
1309 garmin_data_p->flags &= ~FLAGS_QUEUING;
1310 spin_unlock_irqrestore(&garmin_data_p->lock, flags);
1311 }
1312 }
1313 return 0;
1314 }
1315
1316
1317 static void garmin_throttle(struct tty_struct *tty)
1318 {
1319 struct usb_serial_port *port = tty->driver_data;
1320 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1321
1322
1323
1324 spin_lock_irq(&garmin_data_p->lock);
1325 garmin_data_p->flags |= FLAGS_QUEUING|FLAGS_THROTTLED;
1326 spin_unlock_irq(&garmin_data_p->lock);
1327 }
1328
1329
1330 static void garmin_unthrottle(struct tty_struct *tty)
1331 {
1332 struct usb_serial_port *port = tty->driver_data;
1333 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1334 int status;
1335
1336 spin_lock_irq(&garmin_data_p->lock);
1337 garmin_data_p->flags &= ~FLAGS_THROTTLED;
1338 spin_unlock_irq(&garmin_data_p->lock);
1339
1340
1341
1342 if (garmin_data_p->mode == MODE_NATIVE)
1343 garmin_flush_queue(garmin_data_p);
1344
1345 if ((garmin_data_p->flags & FLAGS_BULK_IN_ACTIVE) != 0) {
1346 status = usb_submit_urb(port->read_urb, GFP_KERNEL);
1347 if (status)
1348 dev_err(&port->dev,
1349 "%s - failed resubmitting read urb, error %d\n",
1350 __func__, status);
1351 }
1352 }
1353
1354
1355
1356
1357
1358
1359 static void timeout_handler(struct timer_list *t)
1360 {
1361 struct garmin_data *garmin_data_p = from_timer(garmin_data_p, t, timer);
1362
1363
1364 if (garmin_data_p->mode == MODE_NATIVE)
1365 if (garmin_data_p->flags & FLAGS_QUEUING)
1366 garmin_flush_queue(garmin_data_p);
1367 }
1368
1369
1370
1371 static int garmin_port_probe(struct usb_serial_port *port)
1372 {
1373 int status;
1374 struct garmin_data *garmin_data_p;
1375
1376 garmin_data_p = kzalloc(sizeof(struct garmin_data), GFP_KERNEL);
1377 if (!garmin_data_p)
1378 return -ENOMEM;
1379
1380 timer_setup(&garmin_data_p->timer, timeout_handler, 0);
1381 spin_lock_init(&garmin_data_p->lock);
1382 INIT_LIST_HEAD(&garmin_data_p->pktlist);
1383 garmin_data_p->port = port;
1384 garmin_data_p->state = 0;
1385 garmin_data_p->flags = 0;
1386 garmin_data_p->count = 0;
1387 init_usb_anchor(&garmin_data_p->write_urbs);
1388 usb_set_serial_port_data(port, garmin_data_p);
1389
1390 status = garmin_init_session(port);
1391 if (status)
1392 goto err_free;
1393
1394 return 0;
1395 err_free:
1396 kfree(garmin_data_p);
1397
1398 return status;
1399 }
1400
1401
1402 static void garmin_port_remove(struct usb_serial_port *port)
1403 {
1404 struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
1405
1406 usb_kill_anchored_urbs(&garmin_data_p->write_urbs);
1407 usb_kill_urb(port->interrupt_in_urb);
1408 del_timer_sync(&garmin_data_p->timer);
1409 kfree(garmin_data_p);
1410 }
1411
1412
1413
1414 static struct usb_serial_driver garmin_device = {
1415 .driver = {
1416 .owner = THIS_MODULE,
1417 .name = "garmin_gps",
1418 },
1419 .description = "Garmin GPS usb/tty",
1420 .id_table = id_table,
1421 .num_ports = 1,
1422 .open = garmin_open,
1423 .close = garmin_close,
1424 .throttle = garmin_throttle,
1425 .unthrottle = garmin_unthrottle,
1426 .port_probe = garmin_port_probe,
1427 .port_remove = garmin_port_remove,
1428 .write = garmin_write,
1429 .write_room = garmin_write_room,
1430 .write_bulk_callback = garmin_write_bulk_callback,
1431 .read_bulk_callback = garmin_read_bulk_callback,
1432 .read_int_callback = garmin_read_int_callback,
1433 };
1434
1435 static struct usb_serial_driver * const serial_drivers[] = {
1436 &garmin_device, NULL
1437 };
1438
1439 module_usb_serial_driver(serial_drivers, id_table);
1440
1441 MODULE_AUTHOR(DRIVER_AUTHOR);
1442 MODULE_DESCRIPTION(DRIVER_DESC);
1443 MODULE_LICENSE("GPL");
1444
1445 module_param(initial_mode, int, 0444);
1446 MODULE_PARM_DESC(initial_mode, "Initial mode");