Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2  *  drivers/s390/cio/idset.c
  3  *
  4  *    Copyright IBM Corp. 2007
  5  *    Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
  6  */
  7 
  8 #include <linux/slab.h>
  9 #include <linux/bitops.h>
 10 #include "idset.h"
 11 #include "css.h"
 12 
 13 struct idset {
 14         int num_ssid;
 15         int num_id;
 16         unsigned long bitmap[0];
 17 };
 18 
 19 static inline unsigned long bitmap_size(int num_ssid, int num_id)
 20 {
 21         return __BITOPS_WORDS(num_ssid * num_id) * sizeof(unsigned long);
 22 }
 23 
 24 static struct idset *idset_new(int num_ssid, int num_id)
 25 {
 26         struct idset *set;
 27 
 28         set = kzalloc(sizeof(struct idset) + bitmap_size(num_ssid, num_id),
 29                       GFP_KERNEL);
 30         if (set) {
 31                 set->num_ssid = num_ssid;
 32                 set->num_id = num_id;
 33         }
 34         return set;
 35 }
 36 
 37 void idset_free(struct idset *set)
 38 {
 39         kfree(set);
 40 }
 41 
 42 void idset_clear(struct idset *set)
 43 {
 44         memset(set->bitmap, 0, bitmap_size(set->num_ssid, set->num_id));
 45 }
 46 
 47 void idset_fill(struct idset *set)
 48 {
 49         memset(set->bitmap, 0xff, bitmap_size(set->num_ssid, set->num_id));
 50 }
 51 
 52 static inline void idset_add(struct idset *set, int ssid, int id)
 53 {
 54         set_bit(ssid * set->num_id + id, set->bitmap);
 55 }
 56 
 57 static inline void idset_del(struct idset *set, int ssid, int id)
 58 {
 59         clear_bit(ssid * set->num_id + id, set->bitmap);
 60 }
 61 
 62 static inline int idset_contains(struct idset *set, int ssid, int id)
 63 {
 64         return test_bit(ssid * set->num_id + id, set->bitmap);
 65 }
 66 
 67 static inline int idset_get_first(struct idset *set, int *ssid, int *id)
 68 {
 69         int bitnum;
 70 
 71         bitnum = find_first_bit(set->bitmap, set->num_ssid * set->num_id);
 72         if (bitnum >= set->num_ssid * set->num_id)
 73                 return 0;
 74         *ssid = bitnum / set->num_id;
 75         *id = bitnum % set->num_id;
 76         return 1;
 77 }
 78 
 79 struct idset *idset_sch_new(void)
 80 {
 81         return idset_new(__MAX_SSID + 1, __MAX_SUBCHANNEL + 1);
 82 }
 83 
 84 void idset_sch_add(struct idset *set, struct subchannel_id schid)
 85 {
 86         idset_add(set, schid.ssid, schid.sch_no);
 87 }
 88 
 89 void idset_sch_del(struct idset *set, struct subchannel_id schid)
 90 {
 91         idset_del(set, schid.ssid, schid.sch_no);
 92 }
 93 
 94 int idset_sch_contains(struct idset *set, struct subchannel_id schid)
 95 {
 96         return idset_contains(set, schid.ssid, schid.sch_no);
 97 }
 98 
 99 int idset_sch_get_first(struct idset *set, struct subchannel_id *schid)
100 {
101         int ssid = 0;
102         int id = 0;
103         int rc;
104 
105         rc = idset_get_first(set, &ssid, &id);
106         if (rc) {
107                 init_subchannel_id(schid);
108                 schid->ssid = ssid;
109                 schid->sch_no = id;
110         }
111         return rc;
112 }
113 
  This page was automatically generated by the LXR engine.