Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
cthardware.c
Go to the documentation of this file.
1 
18 #include "cthardware.h"
19 #include "cthw20k1.h"
20 #include "cthw20k2.h"
21 #include <linux/bug.h>
22 
24  enum CTCARDS model, struct hw **rhw)
25 {
26  int err;
27 
28  switch (chip_type) {
29  case ATC20K1:
30  err = create_20k1_hw_obj(rhw);
31  break;
32  case ATC20K2:
33  err = create_20k2_hw_obj(rhw);
34  break;
35  default:
36  err = -ENODEV;
37  break;
38  }
39  if (err)
40  return err;
41 
42  (*rhw)->pci = pci;
43  (*rhw)->chip_type = chip_type;
44  (*rhw)->model = model;
45 
46  return 0;
47 }
48 
49 int destroy_hw_obj(struct hw *hw)
50 {
51  int err;
52 
53  switch (hw->pci->device) {
54  case 0x0005: /* 20k1 device */
55  err = destroy_20k1_hw_obj(hw);
56  break;
57  case 0x000B: /* 20k2 device */
58  err = destroy_20k2_hw_obj(hw);
59  break;
60  default:
61  err = -ENODEV;
62  break;
63  }
64 
65  return err;
66 }
67 
68 unsigned int get_field(unsigned int data, unsigned int field)
69 {
70  int i;
71 
72  BUG_ON(!field);
73  /* @field should always be greater than 0 */
74  for (i = 0; !(field & (1 << i)); )
75  i++;
76 
77  return (data & field) >> i;
78 }
79 
80 void set_field(unsigned int *data, unsigned int field, unsigned int value)
81 {
82  int i;
83 
84  BUG_ON(!field);
85  /* @field should always be greater than 0 */
86  for (i = 0; !(field & (1 << i)); )
87  i++;
88 
89  *data = (*data & (~field)) | ((value << i) & field);
90 }
91