drivers/ec_module.c
branchkernel2.6
changeset 33 f4171b8aadf8
parent 27 d75ef6b46e33
child 34 c1e8d61fa395
equal deleted inserted replaced
32:7d9809fbf7b9 33:f4171b8aadf8
    28 
    28 
    29 #define SUBVERSION_ID "$Id$"
    29 #define SUBVERSION_ID "$Id$"
    30 
    30 
    31 int ecat_master_count = 1;
    31 int ecat_master_count = 1;
    32 EtherCAT_master_t *ecat_masters = NULL;
    32 EtherCAT_master_t *ecat_masters = NULL;
       
    33 int *ecat_masters_reserved = NULL;
    33 
    34 
    34 /******************************************************************************/
    35 /******************************************************************************/
    35 
    36 
    36 MODULE_AUTHOR ("Wilhelm Hagemeister <hm@igh-essen.com>, Florian Pose <fp@igh-essen.com>");
    37 MODULE_AUTHOR ("Wilhelm Hagemeister <hm@igh-essen.com>, Florian Pose <fp@igh-essen.com>");
    37 MODULE_DESCRIPTION ("EtherCAT master driver module");
    38 MODULE_DESCRIPTION ("EtherCAT master driver module");
    42 MODULE_PARM_DESC(ecat_master_count, "Number of EtherCAT master to initialize.");
    43 MODULE_PARM_DESC(ecat_master_count, "Number of EtherCAT master to initialize.");
    43 
    44 
    44 module_init(ecat_init_module);
    45 module_init(ecat_init_module);
    45 module_exit(ecat_cleanup_module);
    46 module_exit(ecat_cleanup_module);
    46 
    47 
    47 EXPORT_SYMBOL(EtherCAT_master);
    48 EXPORT_SYMBOL(EtherCAT_register_device);
       
    49 EXPORT_SYMBOL(EtherCAT_unregister_device);
       
    50 EXPORT_SYMBOL(EtherCAT_request);
       
    51 EXPORT_SYMBOL(EtherCAT_release);
    48 
    52 
    49 /******************************************************************************/
    53 /******************************************************************************/
    50 
    54 
    51 /**
    55 /**
    52    Init-Funktion des EtherCAT-Master-Treibermodules
    56    Init-Funktion des EtherCAT-Master-Treibermodules
    80   {
    84   {
    81     printk(KERN_ERR "EtherCAT: Could not allocate memory for EtherCAT master(s)!\n");
    85     printk(KERN_ERR "EtherCAT: Could not allocate memory for EtherCAT master(s)!\n");
    82     return -1;
    86     return -1;
    83   }
    87   }
    84 
    88 
       
    89   if ((ecat_masters_reserved = (int *) kmalloc(sizeof(int) * ecat_master_count,
       
    90                                                GFP_KERNEL)) == NULL)
       
    91   {
       
    92     printk(KERN_ERR "EtherCAT: Could not allocate memory for reservation flags!\n");
       
    93     kfree(ecat_masters);
       
    94     return -1;
       
    95   }
       
    96 
    85   for (i = 0; i < ecat_master_count; i++)
    97   for (i = 0; i < ecat_master_count; i++)
    86   {
    98   {
    87     EtherCAT_master_init(&ecat_masters[i]);
    99     EtherCAT_master_init(&ecat_masters[i]);
       
   100     ecat_masters_reserved[i] = 0;
    88   }
   101   }
    89 
   102 
    90   printk(KERN_ERR "EtherCAT: Master driver initialized.\n");
   103   printk(KERN_ERR "EtherCAT: Master driver initialized.\n");
    91 
   104 
    92   return 0;
   105   return 0;
   108 
   121 
   109   if (ecat_masters)
   122   if (ecat_masters)
   110   {
   123   {
   111     for (i = 0; i < ecat_master_count; i++)
   124     for (i = 0; i < ecat_master_count; i++)
   112     {
   125     {
       
   126       if (ecat_masters_reserved[i]) {
       
   127         printk(KERN_WARNING "EtherCAT: Warning - Master %i is still in use!\n", i);
       
   128       }
       
   129 
   113       EtherCAT_master_clear(&ecat_masters[i]);
   130       EtherCAT_master_clear(&ecat_masters[i]);
   114     }
   131     }
   115 
   132 
   116     kfree(ecat_masters);
   133     kfree(ecat_masters);
   117   }
   134   }
   118 
   135 
   119   printk(KERN_ERR "EtherCAT: Master driver cleaned up.\n");
   136   printk(KERN_ERR "EtherCAT: Master driver cleaned up.\n");
   120 }
   137 }
   121 
   138 
   122 /******************************************************************************/
   139 /***************************************************************/
   123 
   140 
   124 /**
   141 /**
   125    Gibt einen Zeiger auf einen bestimmten EtherCAT-Master zurueck.
   142    Setzt das EtherCAT-Geraet, auf dem der Master arbeitet.
       
   143 
       
   144    Registriert das Geraet beim Master, der es daraufhin oeffnet.
       
   145 
       
   146    @param master Der EtherCAT-Master
       
   147    @param device Das EtherCAT-Geraet
       
   148    @return 0, wenn alles o.k.,
       
   149            < 0, wenn bereits ein Geraet registriert
       
   150            oder das Geraet nicht geoeffnet werden konnte.
       
   151 */
       
   152 
       
   153 int EtherCAT_register_device(int index, EtherCAT_device_t *device)
       
   154 {
       
   155   if (index < 0 || index >= ecat_master_count)
       
   156   {
       
   157     printk(KERN_ERR "EtherCAT: Master %i does not exist!\n", index);
       
   158     return -1;
       
   159   }
       
   160 
       
   161   return EtherCAT_master_open(&ecat_masters[index], device);
       
   162 }
       
   163 
       
   164 /***************************************************************/
       
   165 
       
   166 /**
       
   167    Loescht das EtherCAT-Geraet, auf dem der Master arbeitet.
       
   168 
       
   169    @param master Der EtherCAT-Master
       
   170    @param device Das EtherCAT-Geraet
       
   171 */
       
   172 
       
   173 void EtherCAT_unregister_device(int index, EtherCAT_device_t *device)
       
   174 {
       
   175   if (index < 0 || index >= ecat_master_count)
       
   176   {
       
   177     printk(KERN_WARNING "EtherCAT: Master %i does not exist!\n", index);
       
   178     return;
       
   179   }
       
   180 
       
   181   EtherCAT_master_close(&ecat_masters[index], device);
       
   182 }
       
   183 
       
   184 /******************************************************************************/
       
   185 
       
   186 /**
       
   187    Reserviert einen bestimmten EtherCAT-Master und das zugehörige Gerät.
       
   188 
       
   189    Gibt einen Zeiger auf den reservierten EtherCAT-Master zurueck.
   126 
   190 
   127    @param index Index des gewuenschten Masters
   191    @param index Index des gewuenschten Masters
   128    @returns Zeiger auf EtherCAT-Master oder NULL, wenn Parameter ungueltig.
   192    @returns Zeiger auf EtherCAT-Master oder NULL, wenn Parameter ungueltig.
   129 */
   193 */
   130 
   194 
   131 EtherCAT_master_t *EtherCAT_master(int index)
   195 EtherCAT_master_t *EtherCAT_request(int index)
   132 {
   196 {
   133   if (index < 0 || index >= ecat_master_count)
   197   if (index < 0 || index >= ecat_master_count) {
   134   {
       
   135     printk(KERN_ERR "EtherCAT: Master %i does not exist!\n", index);
   198     printk(KERN_ERR "EtherCAT: Master %i does not exist!\n", index);
   136     return NULL;
   199     return NULL;
   137   }
   200   }
   138 
   201 
       
   202   if (ecat_masters_reserved[index]) {
       
   203     printk(KERN_ERR "EtherCAT: Master %i already in use!\n", index);
       
   204     return NULL;
       
   205   }
       
   206 
       
   207   if (!ecat_masters[index].dev) {
       
   208     printk(KERN_ERR "EtherCAT: Master %i has no device assigned yet!\n", index);
       
   209     return NULL;
       
   210   }
       
   211 
       
   212   if (!ecat_masters[index].dev->module) {
       
   213     printk(KERN_ERR "EtherCAT: Master %i device module is not set!\n", index);
       
   214     return NULL;
       
   215   }
       
   216 
       
   217   if (!try_module_get(ecat_masters[index].dev->module)) {
       
   218     printk(KERN_ERR "EtherCAT: Could not reserve device module!\n");
       
   219     return NULL;
       
   220   }
       
   221 
       
   222   ecat_masters_reserved[index] = 1;
       
   223 
       
   224   printk(KERN_INFO "EtherCAT: Reserved master %i.\n", index);
       
   225 
   139   return &ecat_masters[index];
   226   return &ecat_masters[index];
   140 }
   227 }
   141 
   228 
   142 /******************************************************************************/
   229 /******************************************************************************/
       
   230 
       
   231 /**
       
   232    Gibt einen zuvor reservierten EtherCAT-Master wieder frei.
       
   233 
       
   234    @param master Zeiger auf den freizugebenden EtherCAT-Master.
       
   235 */
       
   236 
       
   237 void EtherCAT_release(EtherCAT_master_t *master)
       
   238 {
       
   239   unsigned int i;
       
   240 
       
   241   for (i = 0; i < ecat_master_count; i++)
       
   242   {
       
   243     if (&ecat_masters[i] == master)
       
   244     {
       
   245       if (!ecat_masters[i].dev) {
       
   246         printk(KERN_WARNING "EtherCAT: Could not release device"
       
   247                "module because of no device!\n");
       
   248         return;
       
   249       }
       
   250 
       
   251       module_put(ecat_masters[i].dev->module);
       
   252       ecat_masters_reserved[i] = 0;
       
   253 
       
   254       printk(KERN_INFO "EtherCAT: Released master %i.\n", i);
       
   255 
       
   256       return;
       
   257     }
       
   258   }
       
   259 
       
   260   printk(KERN_WARNING "EtherCAT: Master %X was never reserved!\n",
       
   261          (unsigned int) master);
       
   262 }
       
   263 
       
   264 /******************************************************************************/