288 unsigned int i; |
291 unsigned int i; |
289 el600x_baud_rate_t *b_to_use = NULL; |
292 el600x_baud_rate_t *b_to_use = NULL; |
290 el600x_data_frame_t *df_to_use = NULL; |
293 el600x_data_frame_t *df_to_use = NULL; |
291 |
294 |
292 #if DEBUG |
295 #if DEBUG |
293 printk(KERN_INFO PFX "%s(data=%p, cflag=%x).\n", __func__, port, cflag); |
296 printk(KERN_INFO PFX "%s(%s, cflag=%x).\n", __func__, port->name, cflag); |
294 #endif |
297 #endif |
295 |
298 |
296 rtscts = cflag & CRTSCTS; |
299 rtscts = cflag & CRTSCTS; |
297 printk(KERN_INFO PFX "Requested RTS/CTS: %s.\n", rtscts ? "yes" : "no"); |
300 printk(KERN_INFO PFX "%s: Requested RTS/CTS: %s.\n", |
|
301 port->name, rtscts ? "yes" : "no"); |
298 |
302 |
299 cbaud = cflag & CBAUD; |
303 cbaud = cflag & CBAUD; |
300 |
304 |
301 for (i = 0; i < sizeof(el600x_baud_rate) / sizeof(el600x_baud_rate_t); |
305 for (i = 0; i < sizeof(el600x_baud_rate) / sizeof(el600x_baud_rate_t); |
302 i++) { |
306 i++) { |
369 } |
375 } |
370 |
376 |
371 /****************************************************************************/ |
377 /****************************************************************************/ |
372 |
378 |
373 int el60xx_port_init(el60xx_port_t *port, ec_slave_config_t *sc, |
379 int el60xx_port_init(el60xx_port_t *port, ec_slave_config_t *sc, |
374 ec_domain_t *domain, unsigned int slot_offset) |
380 ec_domain_t *domain, unsigned int slot_offset, const char *name) |
375 { |
381 { |
376 int ret = 0; |
382 int ret = 0; |
|
383 |
|
384 strncpy(port->name, name, EL6002_PORT_NAME_SIZE); |
377 |
385 |
378 port->tty = ectty_create(el60xx_cflag_changed, port); |
386 port->tty = ectty_create(el60xx_cflag_changed, port); |
379 if (IS_ERR(port->tty)) { |
387 if (IS_ERR(port->tty)) { |
380 printk(KERN_ERR PFX "Failed to create tty.\n"); |
388 printk(KERN_ERR PFX "Failed to create tty for %s.\n", |
|
389 port->name); |
381 ret = PTR_ERR(port->tty); |
390 ret = PTR_ERR(port->tty); |
382 goto out_return; |
391 goto out_return; |
383 } |
392 } |
384 |
393 |
385 port->max_tx_data_size = 22; |
394 port->max_tx_data_size = 22; |
402 port->current_data_frame = 0x00; |
411 port->current_data_frame = 0x00; |
403 port->config_error = 0; |
412 port->config_error = 0; |
404 |
413 |
405 if (!(port->rtscts_sdo = ecrt_slave_config_create_sdo_request(sc, |
414 if (!(port->rtscts_sdo = ecrt_slave_config_create_sdo_request(sc, |
406 0x8000 + slot_offset, 0x01, 1))) { |
415 0x8000 + slot_offset, 0x01, 1))) { |
407 printk(KERN_ERR PFX "Failed to create SDO request.\n"); |
416 printk(KERN_ERR PFX "Failed to create SDO request for %s.\n", |
|
417 port->name); |
408 ret = -ENOMEM; |
418 ret = -ENOMEM; |
409 goto out_free_tty; |
419 goto out_free_tty; |
410 } |
420 } |
411 |
421 |
412 if (!(port->baud_sdo = ecrt_slave_config_create_sdo_request(sc, |
422 if (!(port->baud_sdo = ecrt_slave_config_create_sdo_request(sc, |
413 0x8000 + slot_offset, 0x11, 1))) { |
423 0x8000 + slot_offset, 0x11, 1))) { |
414 printk(KERN_ERR PFX "Failed to create SDO request.\n"); |
424 printk(KERN_ERR PFX "Failed to create SDO request for %s.\n", |
|
425 port->name); |
415 ret = -ENOMEM; |
426 ret = -ENOMEM; |
416 goto out_free_tty; |
427 goto out_free_tty; |
417 } |
428 } |
418 |
429 |
419 if (!(port->frame_sdo = ecrt_slave_config_create_sdo_request(sc, |
430 if (!(port->frame_sdo = ecrt_slave_config_create_sdo_request(sc, |
420 0x8000 + slot_offset, 0x15, 1))) { |
431 0x8000 + slot_offset, 0x15, 1))) { |
421 printk(KERN_ERR PFX "Failed to create SDO request.\n"); |
432 printk(KERN_ERR PFX "Failed to create SDO request for %s\n", |
|
433 port->name); |
422 ret = -ENOMEM; |
434 ret = -ENOMEM; |
423 goto out_free_tty; |
435 goto out_free_tty; |
424 } |
436 } |
425 |
437 |
426 ret = ecrt_slave_config_reg_pdo_entry( |
438 ret = ecrt_slave_config_reg_pdo_entry( |
427 sc, 0x7001 + slot_offset, 0x01, domain, NULL); |
439 sc, 0x7001 + slot_offset, 0x01, domain, NULL); |
428 if (ret < 0) { |
440 if (ret < 0) { |
429 printk(KERN_ERR PFX "Failed to register PDO entry.\n"); |
441 printk(KERN_ERR PFX "Failed to register PDO entry of %s\n", |
|
442 port->name); |
430 goto out_free_tty; |
443 goto out_free_tty; |
431 } |
444 } |
432 port->off_ctrl = ret; |
445 port->off_ctrl = ret; |
433 |
446 |
434 ret = ecrt_slave_config_reg_pdo_entry( |
447 ret = ecrt_slave_config_reg_pdo_entry( |
435 sc, 0x7000 + slot_offset, 0x11, domain, NULL); |
448 sc, 0x7000 + slot_offset, 0x11, domain, NULL); |
436 if (ret < 0) { |
449 if (ret < 0) { |
437 printk(KERN_ERR PFX "Failed to register PDO entry.\n"); |
450 printk(KERN_ERR PFX "Failed to register PDO entry of %s.\n", |
|
451 port->name); |
438 goto out_free_tty; |
452 goto out_free_tty; |
439 } |
453 } |
440 port->off_tx = ret; |
454 port->off_tx = ret; |
441 |
455 |
442 ret = ecrt_slave_config_reg_pdo_entry( |
456 ret = ecrt_slave_config_reg_pdo_entry( |
443 sc, 0x6001 + slot_offset, 0x01, domain, NULL); |
457 sc, 0x6001 + slot_offset, 0x01, domain, NULL); |
444 if (ret < 0) { |
458 if (ret < 0) { |
445 printk(KERN_ERR PFX "Failed to register PDO entry.\n"); |
459 printk(KERN_ERR PFX "Failed to register PDO entry of %s.\n", |
|
460 port->name); |
446 goto out_free_tty; |
461 goto out_free_tty; |
447 } |
462 } |
448 port->off_status = ret; |
463 port->off_status = ret; |
449 |
464 |
450 ret = ecrt_slave_config_reg_pdo_entry( |
465 ret = ecrt_slave_config_reg_pdo_entry( |
451 sc, 0x6000 + slot_offset, 0x11, domain, NULL); |
466 sc, 0x6000 + slot_offset, 0x11, domain, NULL); |
452 if (ret < 0) { |
467 if (ret < 0) { |
453 printk(KERN_ERR PFX "Failed to register PDO entry.\n"); |
468 printk(KERN_ERR PFX "Failed to register PDO entry of %s.\n", |
|
469 port->name); |
454 goto out_free_tty; |
470 goto out_free_tty; |
455 } |
471 } |
456 port->off_rx = ret; |
472 port->off_rx = ret; |
457 |
473 |
458 if (port->max_tx_data_size > 0) { |
474 if (port->max_tx_data_size > 0) { |
459 port->tx_data = kmalloc(port->max_tx_data_size, GFP_KERNEL); |
475 port->tx_data = kmalloc(port->max_tx_data_size, GFP_KERNEL); |
460 if (port->tx_data == NULL) { |
476 if (port->tx_data == NULL) { |
|
477 printk(KERN_ERR PFX "Failed to allocate %u bytes of TX" |
|
478 " memory for %s.\n", port->max_tx_data_size, port->name); |
461 ret = -ENOMEM; |
479 ret = -ENOMEM; |
462 goto out_free_tty; |
480 goto out_free_tty; |
463 } |
481 } |
464 } |
482 } |
465 |
483 |
542 rx_request_toggle = status & 0x0002; |
561 rx_request_toggle = status & 0x0002; |
543 if (rx_request_toggle != port->rx_request_toggle) { |
562 if (rx_request_toggle != port->rx_request_toggle) { |
544 uint8_t rx_data_size = status >> 8; |
563 uint8_t rx_data_size = status >> 8; |
545 port->rx_request_toggle = rx_request_toggle; |
564 port->rx_request_toggle = rx_request_toggle; |
546 #if DEBUG |
565 #if DEBUG |
547 printk(KERN_INFO PFX "Received %u bytes.\n", rx_data_size); |
566 printk(KERN_INFO PFX "%s: Received %u bytes.\n", |
|
567 port->name, rx_data_size); |
548 #endif |
568 #endif |
549 ectty_rx_data(port->tty, rx_data, rx_data_size); |
569 ectty_rx_data(port->tty, rx_data, rx_data_size); |
550 port->rx_accepted_toggle = !port->rx_accepted_toggle; |
570 port->rx_accepted_toggle = !port->rx_accepted_toggle; |
551 } |
571 } |
552 |
572 |
565 } |
585 } |
566 break; |
586 break; |
567 |
587 |
568 case SER_WAIT_FOR_INIT_RESPONSE: |
588 case SER_WAIT_FOR_INIT_RESPONSE: |
569 if (!(status & (1 << 2))) { |
589 if (!(status & (1 << 2))) { |
570 printk(KERN_INFO PFX "EL600x init successful.\n"); |
590 printk(KERN_INFO PFX "%s: Init successful.\n", port->name); |
571 port->tx_accepted_toggle = 1; |
591 port->tx_accepted_toggle = 1; |
572 port->control = 0x0000; |
592 port->control = 0x0000; |
573 port->state = SER_READY; |
593 port->state = SER_READY; |
574 } |
594 } |
575 break; |
595 break; |
576 |
596 |
577 case SER_SET_RTSCTS: |
597 case SER_SET_RTSCTS: |
578 switch (ecrt_sdo_request_state(port->rtscts_sdo)) { |
598 switch (ecrt_sdo_request_state(port->rtscts_sdo)) { |
579 case EC_REQUEST_SUCCESS: |
599 case EC_REQUEST_SUCCESS: |
580 printk(KERN_INFO PFX "Slave accepted RTS/CTS.\n"); |
600 printk(KERN_INFO PFX "%s: Accepted RTS/CTS.\n", |
|
601 port->name); |
581 port->current_rtscts = port->requested_rtscts; |
602 port->current_rtscts = port->requested_rtscts; |
582 port->state = SER_REQUEST_INIT; |
603 port->state = SER_REQUEST_INIT; |
583 break; |
604 break; |
584 case EC_REQUEST_ERROR: |
605 case EC_REQUEST_ERROR: |
585 printk(KERN_INFO PFX "Failed to set RTS/CTS!\n"); |
606 printk(KERN_ERR PFX "Failed to set RTS/CTS on %s!\n", |
|
607 port->name); |
586 port->state = SER_REQUEST_INIT; |
608 port->state = SER_REQUEST_INIT; |
587 port->config_error = 1; |
609 port->config_error = 1; |
588 break; |
610 break; |
589 default: |
611 default: |
590 break; |
612 break; |
592 break; |
614 break; |
593 |
615 |
594 case SER_SET_BAUD_RATE: |
616 case SER_SET_BAUD_RATE: |
595 switch (ecrt_sdo_request_state(port->baud_sdo)) { |
617 switch (ecrt_sdo_request_state(port->baud_sdo)) { |
596 case EC_REQUEST_SUCCESS: |
618 case EC_REQUEST_SUCCESS: |
597 printk(KERN_INFO PFX "Slave accepted baud rate.\n"); |
619 printk(KERN_INFO PFX "%s: Accepted baud rate.\n", |
|
620 port->name); |
598 port->current_baud_rate = port->requested_baud_rate; |
621 port->current_baud_rate = port->requested_baud_rate; |
599 port->state = SER_REQUEST_INIT; |
622 port->state = SER_REQUEST_INIT; |
600 break; |
623 break; |
601 case EC_REQUEST_ERROR: |
624 case EC_REQUEST_ERROR: |
602 printk(KERN_INFO PFX "Failed to set baud rate!\n"); |
625 printk(KERN_ERR PFX "Failed to set baud rate on %s!\n", |
|
626 port->name); |
603 port->state = SER_REQUEST_INIT; |
627 port->state = SER_REQUEST_INIT; |
604 port->config_error = 1; |
628 port->config_error = 1; |
605 break; |
629 break; |
606 default: |
630 default: |
607 break; |
631 break; |
609 break; |
633 break; |
610 |
634 |
611 case SER_SET_DATA_FRAME: |
635 case SER_SET_DATA_FRAME: |
612 switch (ecrt_sdo_request_state(port->frame_sdo)) { |
636 switch (ecrt_sdo_request_state(port->frame_sdo)) { |
613 case EC_REQUEST_SUCCESS: |
637 case EC_REQUEST_SUCCESS: |
614 printk(KERN_INFO PFX "Slave accepted data frame.\n"); |
638 printk(KERN_INFO PFX "%s: Accepted data frame.\n", |
|
639 port->name); |
615 port->current_data_frame = port->requested_data_frame; |
640 port->current_data_frame = port->requested_data_frame; |
616 port->state = SER_REQUEST_INIT; |
641 port->state = SER_REQUEST_INIT; |
617 break; |
642 break; |
618 case EC_REQUEST_ERROR: |
643 case EC_REQUEST_ERROR: |
619 printk(KERN_INFO PFX "Failed to set data frame!\n"); |
644 printk(KERN_ERR PFX "Failed to set data frame on %s!\n", |
|
645 port->name); |
620 port->state = SER_REQUEST_INIT; |
646 port->state = SER_REQUEST_INIT; |
621 port->config_error = 1; |
647 port->config_error = 1; |
622 break; |
648 break; |
623 default: |
649 default: |
624 break; |
650 break; |
637 { |
663 { |
638 int ret = 0, i; |
664 int ret = 0, i; |
639 |
665 |
640 if (!(el6002->sc = ecrt_master_slave_config( |
666 if (!(el6002->sc = ecrt_master_slave_config( |
641 master, 0, position, vendor, product))) { |
667 master, 0, position, vendor, product))) { |
642 printk(KERN_ERR PFX "Failed to create slave configuration.\n"); |
668 printk(KERN_ERR PFX "EL6002(%u): Failed to create" |
|
669 " slave configuration.\n", position); |
643 ret = -EBUSY; |
670 ret = -EBUSY; |
644 goto out_return; |
671 goto out_return; |
645 } |
672 } |
646 |
673 |
647 if (ecrt_slave_config_pdos(el6002->sc, EC_END, el6002_syncs)) { |
674 if (ecrt_slave_config_pdos(el6002->sc, EC_END, el6002_syncs)) { |
648 printk(KERN_ERR PFX "Failed to configure PDOs.\n"); |
675 printk(KERN_ERR PFX "EL6002(%u): Failed to configure PDOs.\n", |
|
676 position); |
649 ret = -ENOMEM; |
677 ret = -ENOMEM; |
650 goto out_return; |
678 goto out_return; |
651 } |
679 } |
652 |
680 |
653 for (i = 0; i < EL6002_PORTS; i++) { |
681 for (i = 0; i < EL6002_PORTS; i++) { |
654 if (el60xx_port_init(el6002->port + i, el6002->sc, domain, i * 0x10)) { |
682 char name[EL6002_PORT_NAME_SIZE]; |
655 printk(KERN_ERR PFX "Failed to init port X%u.\n", i); |
683 snprintf(name, EL6002_PORT_NAME_SIZE, "EL6002(%u) X%u", |
|
684 position, i + 1); |
|
685 if (el60xx_port_init(el6002->port + i, el6002->sc, domain, i * 0x10, |
|
686 name)) { |
|
687 printk(KERN_ERR PFX "EL6002(%u): Failed to init port X%u.\n", |
|
688 position, i); |
656 goto out_ports; |
689 goto out_ports; |
657 } |
690 } |
658 } |
691 } |
659 |
692 |
660 return 0; |
693 return 0; |